Заголовок If-None-Match отменяет Cache-Control: max-age?
У меня есть веб-приложение, которое обслуживает изображение:
Я четко устанавливаю Cache-Control
заголовок, и веб-сервер устанавливает Etag
,
Проблема в том, что ресурсы If-None-Match
каждый раз эффективно игнорируя Cache-Control
заголовок. (Фреймворк возвращает 304 соответственно, но существует и туда и обратно).
Я читал, что Etag
заголовок может отменять Cache-Control
и все еще идти, чтобы проверить соответствие, даже если ресурс является локальным и действительным. Это не имеет смысла для меня.
Кто-нибудь знает, что происходит? Что мне здесь не хватает?
PD: веб-сервер является Play! приложение
2 ответа
Наконец то понял. Некоторые браузеры (наверняка, Google Chrome и Firefox) игнорируют локальный кеш при перезагрузке страницы с помощью CMD+R или F5.
В моем случае, независимо от того, как высоко я установил максимальный возраст, перезагрузка страницы всегда будет вызывать If-None-Match
проверьте и получите 304 обратно. Навигация по сайту с помощью ссылок не вызовет такого поведения, и кэши будут работать очень хорошо.
Примечание. Я этого не заметил, поскольку в одностраничном веб-приложении (например, в моем) нет "навигации по ссылкам", так как большинство из них загружаются в начале.
Вы можете быть поражены прокси.
max-age
Директива предназначена для браузеров, а s-maxage
Директива предназначена для прокси.
Похоже, вам не хватает директивы s-maxage в заголовке Cache-Control.
Вы также можете добавить public
директива(хотя в соответствии со спецификацией это должно быть по умолчанию, это не помешает установить его явно)
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
Кроме того, имейте в виду, что некоторые прокси могут очень хорошо игнорировать все это, поэтому вы не прекратите получать запросы полностью, даже если у вас все отлично настроено на вашей стороне.
У меня есть все 3 директивы, установленные в службе, которая обслуживает образы (которая также использует ETag и Last-Modified) для CDN, и я не заметил ненормального поведения в моих тестах.