Максимальне значення для заголовка кеш-пам’яті в HTTP


80

Я використовую Amazon S3 для обслуговування статичних активів для свого веб-сайту. Я хочу, щоб браузери кешували ці ресурси якомога довше. Які заголовки метаданих слід включити до своїх ресурсів

Cache-Control: max-age=???

можливе значення max-age залежить від браузера / версії та будь-якого проксі на шляху ... AFAIK не існує реального стандарту / специфікації, тому будь-яке значення було б здогадкою ...
Yahia

Відповіді:


120

Зазвичай один рік рекомендується як стандартне максимальне значення. Див. RFC 2616 :

Щоб позначити відповідь як "ніколи не закінчується", початковий сервер надсилає дату закінчення приблизно через рік з моменту надсилання відповіді. Сервери HTTP / 1.1 НЕ ПОВИННІ надсилати Термін дії закінчується більше одного року в майбутньому.

Хоча це стосується і старішого expiresстандарту, має сенс застосовувати його cache-controlтакож за відсутності явних вказівок щодо стандартів. Це стільки, скільки вам взагалі знадобиться, і вибір будь-якого довільно більшого значення може зламати деякі користувацькі агенти. Так:

Cache-Control: max-age=31536000

22

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

RFC обговорює максимальний вік тут: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

Ерік Лоуренс каже, що до IE9 Internet Explorer вважав застарілим будь-який ресурс кеш-контролем: значення 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
Керування кешем: max-age = 31536000 буде кешувати його протягом 1 року, що є максимально рекомендованим.
EricLaw

2
@Geoffrey: Я думаю, вас бентежить те, що будує Кейсі. Він просто говорить, що змінить URL-адресу, на яку посилається у своїй розмітці, коли версія зміниться. Це найкраща практика, яку використовують більшість найкращих сайтів.
EricLaw

@Geoffrey Ви впевнені, що "понад 2147483648"? Я думав, що це "понад 2147483647"?
Pacerier

4

Люди, які створили рекомендацію щодо кешування максимум на 1 рік, не продумали її належним чином.

Перш за все, якщо відвідувачеві подають застарілий кешований файл, то чому б це забезпечило будь-яку перевагу, якщо він раптово завантажить нову версію через 1 рік? Якщо файл має 1-річний TTL, з функціональної точки зору, це, очевидно, означає, що файл взагалі не призначений для зміни.

То навіщо потрібно більше 1 року?

1) Чому ні? Це не має жодної мети для сервера, щоб сказати відвідувачам браузера "привіт, цьому файлу 1 рік, можливо, варто перевірити, чи оновлений".

2) послуги CDN. Більшість мереж доставки вмісту використовують заголовок кешу, щоб вирішити, як довго ефективно обслуговувати файл із граничного сервера. Якщо у вас є 1-річний кеш-файл для файлів, він в якийсь момент почне повторно запитувати незмінені файли з вихідного сервера, а кеш-пам’ять потрібно буде повністю заповнити, що спричинить повільніші навантаження для клієнта та зайве дзвінки до походження.

Який сенс мати максимум 1 рік? Які браузери подавляться сумою, встановленою вище 31536000?


3
1 рік - це вічність у віці Інтернету. Плюс, якщо ви серйозно поставитесь до кешування, ви б обробляли (на додаток до кешування) останній модифікований та / або етапний механізм. Тож навіть ці повторні запити через рік не зашкодять пропускній здатності (304 не змінено)
redben

2
1 рік - це не вічність, коли ваші зображення НІКОЛИ не змінюються (як і більшість зображень в Інтернеті), і коли ви не хочете, щоб CDN оновлював файли з джерела (що було б безглуздо). Що стосується останньої модифікації / etag, звичайно, це ініціює запит та діалог між клієнтом та сервером, лише для того, щоб дізнатись, що ми вже знаємо "yup, все ще добре обслуговувати кешований файл". Ваша аргументація полягає в тому, що "1 рік - це вічність в Інтернеті", що не дає нічого продуктивного. Я призначив 10-річний термін дії зображень, що просто сприяє кращому кінцевому результату.
suncat100

3
А ще є розмір кешу браузера за замовчуванням. Чи витримає якийсь кешований ресурс рік у кеші браузера? Не знаю.
redben

Надзвичайно малоймовірно. Щось, що ще більше доводить безглуздість встановлення значення "1 рік", якщо воно не служить іншим цілям, крім спроб кешувати елемент "назавжди" або "якомога довше" ...
suncat100,

Мова не йде про кешування браузером. Йдеться про проміжні проксі-сервери, які кешують його, такі як Akamai і Varnish, мобільний проксі Google тощо
Елайджа Лінн,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.