Назад | Перейти на главную страницу

Почему эта конфигурация HTTP-заголовка заставляет браузеры всегда выполнять запросы If-Modified-Since?

На нашем сервере мы настроили заголовки HTTP-ответов следующим образом:

Cache-Control:max-age=28800, must-revalidate   # (8 hours)
Connection:Keep-Alive
Date:Wed, 24 Apr 2013 21:36:19 GMT
ETag:W/"173520-1366833451000"
Expires:Thu, 25 Apr 2013 05:36:19 GMT          # (8 hours from access)
Keep-Alive:timeout=15, max=484
Server:Apache-Coyote/1.1
Vary:Accept-Encoding,User-Agent

Мы хотели, чтобы ресурс кешировался браузером на 8 часов, после чего браузер должен проверить, не был ли он изменен (с помощью 304 request) перед использованием кэшированной копии.

Однако я обнаружил, что браузер всегда делает 304. (Он продолжает использовать свою кэшированную копию, но перед этим проверяет сервер на наличие изменений - что я хочу, чтобы это происходило через 8 часов, а не все время.)

Как я думал, это должно сработать, Cache-Control:max-age=28800, must-revalidate должен указать клиенту использовать кэшированный ресурс, пока он не достигнет max-age в кеше, после чего must-revalidate с исходным сервером. Я считаю, что Expires директива является скорее запасным вариантом, и что Cache-Control заменяет - но если это мы во время игры я ожидаю, что браузер будет использовать кешированную копию до истечения срока действия, а затем получит новую копию. Большая часть этого почерпнута из эта запись, и немного изучив спецификацию.

Очевидно, мое понимание неполное - что мне не хватает?

РЕДАКТИРОВАТЬ: Я ошибочно предположил, что, обновляя текущую страницу, я буду тестировать, что происходит, когда браузер переходит на последующие страницы, на которые связаны те же ресурсы. Я был неправ - нажатие кнопки "обновить" обычно заставляет браузер чек если какой-либо из ресурсов был изменен перед использованием кэшированных копий, что имеет безумно очевидный смысл. Когда я перехожу на другие страницы, ресурсы извлекаются прямо из кеша, как и ожидалось.

Это желаемое поведение специально для кнопки перезагрузки браузера. Кнопка перезагрузки попытается проверить страницу и некоторый контент, например CSS.

Есть и другие способы загрузить вашу страницу, например, уйти и вернуться. Или нажмите на адресную строку и нажмите «Enter». В таких случаях браузер будет использовать кэшированные данные без повторной проверки.