Максимальное значение для заголовка управления кешем в HTTP

80

Я использую Amazon S3 для обслуживания статических ресурсов на моем веб-сайте. Я хочу, чтобы браузеры кэшировали эти ресурсы как можно дольше. Какие заголовки метаданных я должен включать в свои активы

Cache-Control: max-age=???
Кейси Флинн
источник
возможное значение max-age зависит от браузера / версии и любого прокси на пути ... AFAIK нет настоящего стандарта / спецификации, поэтому любое значение было бы предположением ...
Яхия

Ответы:

120

Обычно рекомендуется один год в качестве стандартного максимального значения. См. RFC 2616 :

Чтобы пометить ответ как «никогда не истекающий», исходный сервер отправляет дату истечения срока примерно через год с момента отправки ответа. Серверы HTTP / 1.1 НЕ ДОЛЖНЫ отправлять даты истечения срока действия более чем на один год в будущем.

Хотя это применимо к более старому expiresстандарту, имеет смысл применить и к нему cache-controlв отсутствие каких-либо явных указаний по стандартам. Это столько, сколько вам обычно нужно, и выбор произвольно большего значения может сломать некоторые пользовательские агенты. Так:

Cache-Control: max-age=31536000
Mahemoff
источник
22

Попробуйте не хранить его «как можно дольше», а вместо этого оставайтесь настолько долго, насколько это разумно. Например, маловероятно, что вам понадобится кэшировать его дольше, чем, скажем, 10 лет ... я прав?

В RFC обсуждается максимальный возраст здесь: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

Эрик Лоуренс говорит, что до IE9 Internet Explorer считал устаревшими любые ресурсы с параметром Cache-Control: max-age более 2147483648 (2 ^ 31) секунд, примерно 68 лет ( http://blogs.msdn.com/b /ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx ).

Другие пользовательские агенты, конечно, будут отличаться, поэтому ... попробуйте выбрать число, которое вряд ли (скорее, чем вероятно!) Вызовет переполнение. Максимальный возраст больше 31536000 (один год) не имеет смысла, и неформально это считается разумным максимальным значением.

Джеффри МакГрат
источник
Я действительно ищу конкретные заголовки для отправки. У меня есть механизм, встроенный в мой веб-сайт, чтобы изменить URL-адрес файла, чтобы он указывал на другое имя файла, если мне нужно внести изменения и посетители увидят его. Мне просто нужен пример конкретных заголовков, которые нужно отправить, чтобы браузеры кешировали эти ресурсы на неопределенный срок.
Кейси Флинн,
12
Cache-Control: max-age = 31536000 будет кэшировать его на 1 год, что является максимальным рекомендуемым значением.
EricLaw
2
@Geoffrey: Думаю, ты не понимаешь, что строит Кейси. Он просто говорит, что изменит URL-адрес, на который он ссылается в своей разметке, при изменении версии. Это лучшая практика, используемая большинством популярных сайтов.
EricLaw
@Geoffrey Вы уверены, что "больше 2147483648"? Я думал, что «больше 2147483647»?
Pacerier
4

Люди, которые создали рекомендацию максимум на 1 год кеширования, не продумали ее должным образом.

Во-первых, если посетителю предоставляется устаревший кэшированный файл, то почему он может дать какую-либо пользу, если он внезапно загрузит новую версию через год? Если у файла TTL 1 год, с функциональной точки зрения это, очевидно, означает, что файл вообще не предназначен для изменения.

Так зачем нужно больше 1 года?

1) Почему бы и нет? Он не имеет какой-либо цели сообщить браузеру посетителей: «Эй, этому файлу 1 год, было бы неплохо проверить, обновлялся ли он».

2) Услуги CDN. Большинство сетей доставки контента используют заголовок кеша, чтобы решить, как долго эффективно обслуживать файл с пограничного сервера. Если у вас есть годовой контроль кеша для файлов, он в какой-то момент начнет повторно запрашивать неизмененные файлы с исходного сервера, и пограничный кеш необходимо будет полностью повторно заполнить, что приведет к более медленной загрузке для клиента и ненужным звонки на происхождение.

Какой смысл иметь максимум 1 год? Какие браузеры задохнутся от набора суммы выше 31536000?

suncat100
источник
3
1 год - это вечность в эпоху Интернета. Кроме того, если вы серьезно относитесь к кешированию, вы будете обрабатывать (в дополнение к управлению кешем) механизм last-modified и / или etag. Таким образом, даже эти повторные запросы через год не
повредят
2
1 год - это не вечность, когда ваши изображения НИКОГДА не меняются (как и большинство изображений в Интернете), и когда вы не хотите, чтобы CDN обновлял файлы из источника (что было бы бессмысленно). Что касается last-modified / etag, конечно, который инициирует запрос и диалог между клиентом и сервером, просто чтобы узнать то, что мы уже знаем: «Да, все еще нормально обслуживать кешированный файл». Ваш аргумент в основном сводится к тому, что «1 год - это вечность в Интернете», что не дает ничего продуктивного. Я установил срок действия 10 лет для изображений, что просто служит лучшему конечному результату.
suncat100
3
Да, еще есть размер кеша браузера по умолчанию. Выживет ли какой-либо кэшированный актив в кеше браузера в течение года? Я не знаю.
redben
Крайне маловероятно. Что-то, что еще раз доказывает бессмысленность установки «1 год», когда это не служит никакой другой цели, кроме попытки кэшировать элемент «навсегда» или «как можно дольше» ...
suncat100
Дело не в том, что браузер кеширует это. Речь идет о промежуточных прокси-серверах, кэширующих его, таких как Akamai и Varnish, мобильный прокси Google и т. Д.
Элайджа Линн