Я пытаюсь найти лучшие HTTP-заголовки для отправки в четырех случаях использования. Я надеюсь получить заголовки, которые не зависят от версии агента пользователя/протокола, но я соглашусь, если ничего другого не подойдет. Все URL-адреса получаются с помощью полностью настраиваемого обработчика, поэтому я могу выбрать все заголовки, как мне нравится, это все о промежуточных прокси и пользовательских агентах. Если это возможно, это должно быть совместимо с клиентами HTTP/1.0 и HTTP/1.1. Если существует несколько решений, лучший из них будет самым коротким при отправке по проводу.
Статический общедоступный контент
Все "Статический общедоступный контент" - это то, о чем HTTP-адрес действительно: если URL-адрес тот же, контент тот же. Я могу сделать это легко: например, я поместил значок профиля пользователя в http://domain.com/profiles/xyz/icon/1234abcd, где "1234abcd" - это SHA-1 содержимого файла иконы. Если в будущем я перейду к значку, я создам новый URL-адрес и изменю все существующие источники, которые должны использовать новый значок. Каковы наилучшие заголовки, чтобы заявить, что это может быть кэшировано навсегда и может быть разделено? Я сейчас что-то думаю по строкам:
Date: <current time>
Expires: <current time + one year>
Достаточно ли этого, чтобы разрешить кеширование агентами и прокси-серверами? Нужно ли мне Last-Modified
или Pragma
?
Статический непубличный контент
Все "Статический непубличный контент" - это материал, который статичен, но может быть недоступен для всех. Фактически, этот контент будет доступен только для выбранных зарегистрированных пользователей (сеанс хранится с сеансом UUID сессии cookie сеанса). Если URL-адрес один и тот же, контент один и тот же. Однако ответ не является общедоступным. Вариант использования может быть изображением, совместно используемым избранными друзьями в службе социальной сети. Я сейчас что-то думаю по строкам:
Date: <current time>
Expires: <current time>
Cache-Control: private, max-age=<huge number>, s-maxage=0
Достаточно ли этого, чтобы разрешить кеширование агентами пользователя и отключить прокси? Мне нужно Pragma
?
Неустойчивый публичный контент
Все "Неустойчивое публичное содержимое" - это материал, который нестабилен и доступен для всех. Что-то вроде frontpage http://slashdot.org/, когда вы не вошли в систему. Цель состоит в том, чтобы быстро обновлять контент в неизменяемом URL. Обратите внимание, что я НЕ хочу разрушать механизм истории пользовательских агентов (то есть щелкнуть что-то с измененной страницы, а затем нажать кнопку "Назад" , не приведет к извлечению изменчивой страницы с сервера), однако, щелкнув ссылку, которая идет на на первой странице должен быть выбран ресурс с сервера). Я сейчас что-то думаю по строкам:
Date: <current time>
Expires: <current time>
Cache-Control: public, max-age=0, s-maxage=0
Достаточно ли этого, чтобы предотвратить кеширование, но разрешить механизм истории (кнопка возврата)? Я знаю, что если я отправлю Cache-Control: no-store, must-revalidate
, я могу принудительно перезагрузить, но это не то, что я хочу, потому что это тоже сломает кнопку "Назад" . Нужно ли мне Last-Modified
или Pragma
?
Несмотря на то, что это общедоступно, вероятно, не имеет смысла позволять промежуточным прокси кэшировать это, потому что он нестабилен.
Летучий непубличный контент
Все "Неустойчивый непубличный контент" - это материал, который неустойчив и недоступен для всех (частный). Что-то вроде главной страницы http://slashdot.org/, когда вы вошли в систему. Цель состоит в том, чтобы быстро обновлять контент в неизменяемом URL. Обратите внимание, что я НЕ хочу разрушать механизм истории пользовательских агентов (то есть щелкнуть что-то с измененной страницы, а затем нажать кнопку "Назад" , не приведет к извлечению изменчивой страницы с сервера), однако, щелкнув ссылку, которая идет на на первой странице должен быть выбран ресурс с сервера). Я сейчас что-то думаю по строкам:
Date: <current time>
Expires: <current time>
Cache-Control: private, max-age=0, s-maxage=0
Достаточно ли этого, чтобы предотвратить кеширование, но разрешить механизм истории (кнопка возврата)? Мне нужно Pragma
?
Вещи, которые все еще нуждаются в тестировании с моими предлагаемыми заголовками:
- Убедитесь, что личный контент не будет пропущен через прокси HTTP/1.0.
- Убедитесь, что кеширование работает правильно в прокси.
- Убедитесь, что кеширование работает правильно в пользовательских агентах.
- Убедитесь, что механизм агентов пользовательского агента работает в пользовательских агентах (все случаи).
- Убедитесь, что после ссылки на энергозависимую страницу выбирается свежий контент с сервера.
- Проверьте все результаты при использовании HTTPS вместо HTTP.