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

Я хочу найти минимальный набор заголовков, которые работают с "всеми" кэшами и браузерами (также при использовании HTTPS!)

На моем веб-сайте у меня будет три вида ресурсов:

(1) Forever cacheable (общедоступный/равный для всех пользователей)

Пример: 0A470E87CC58EE133616F402B5DDFE1C.cache.html(автоматически генерируется GWT)

  • Этим файлам автоматически присваивается новое имя при изменении содержимого (на основе MD5).

  • Они должны кэшироваться как можно больше, даже при использовании HTTPS (поэтому я предполагаю, что я должен установить Cache-Control: public, особенно для Firefox?)

  • Они не должны требовать от клиента совершить обратный путь к серверу для проверки, если содержимое изменилось.

(2) Временное изменение (общедоступное/равное для всех пользователей)

Примеры: index.html, mymodule.nocache.js

  • Эти файлы меняют свой контент без изменения URL-адреса при развертывании новой версии сайта.

  • Они могут быть кэшированы, но, вероятно, необходимо периодически проверять обратную связь.

(3) Индивидуальный для каждого запроса (частный/пользовательский)

Пример: ответы JSON

  • Эти ресурсы никогда не должны кэшироваться без шифрования на диск ни при каких обстоятельствах. (За исключением, может быть, у меня будет несколько конкретных запросов, которые можно кэшировать.)

У меня есть общая идея о том, какие заголовки я, вероятно, буду использовать для каждого типа, но всегда есть что-то, чего я не могу потерять.

Ответ 1

Я бы использовал следующие настройки:

  • Cache-Control: max-age=31556926 - Представления могут кэшироваться любым кешем. Кэш-представление следует считать свежим в течение 1 года:

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

  • Cache-Control: no-cache - Представления могут быть кэшированы любым кешем. Но кеши должны отправить запрос серверу происхождения для проверки перед выпуском кешированной копии.
  • Cache-Control: no-store - Кэши не должны кэшировать представление при любых условиях.

Для получения дополнительной информации см. Mark Nottinghams Caching Tutorial.

Ответ 2

Случаи один и два на самом деле являются одним и тем же сценарием. Вы должны установить Cache-Control: public, а затем сгенерировать URL-адрес, содержащий номер сборки/версию сайта, чтобы у вас были непреложные ресурсы, которые могут потенциально длиться вечно. Вы также хотите установить заголовок Expires в год или более в будущем, чтобы клиент не нуждался в проверке свежести.

В случае 3 для максимальной гибкости вы можете использовать все следующие функции:

"Cache-Control", "no-cache, must-revalidate"
"Expires", 0
"Pragma", "no-cache"