На нашем сервере мы настроили заголовки 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». В таких случаях браузер будет использовать кэшированные данные без повторной проверки.