Google Chrome не обновляет etag на back/forth
Даже несмотря на то, что я отправляю "управление кешем: необходимо-revalidate", Google Chrome использует локально кэшированную страницу при использовании кнопки "Назад" и "Назад" в браузере.
Это часть исходного ответа:
HTTP/1.1 200 OK
cache-control: private, must-revalidate
etag: "c9239b5d4b98949f8469a05062e05bb999d7512e"
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Если я обновляю страницу, я получаю ответ "HTTP/1.1 304 Not Modified", но когда я использую кнопку "Назад" , я получаю следующий ответ:
Request URL:example.com
Request Method:GET
Status Code:200 OK (from cache)
Ответ, который я ищу, - 304 или 200, можно ли достичь этого?
Ответы
Ответ 1
При использовании кнопок "Назад" и "Вперед" ключевая директива Cache-Control
для предотвращения возврата браузером кешированной копии страницы no-store
.
Ничто другое не поможет, и больше ничего не нужно. Ваш заголовок Cache-Control
может быть просто:
Cache-Control: no-store
Есть два исключения из этого.
- Opera и Safari не будут revalidate независимо от того, какие заголовки вы установили (по крайней мере, те версии, которые я тестировал). Если вы откроете страницу на новой вкладке, эта копия будет новой, но исходная вкладка будет продолжать показывать устаревшую версию при навигации вперед и назад, пока вы не обновите или не заново введите URL-адрес.
- У Firefox, похоже, есть ошибка в кешировании первой открытой страницы (т.е. когда кнопки возврата нет). Все последующие экземпляры страницы будут обновляться при перемещении вперед и назад, но как только вы полностью зарезервируете до самой верхней страницы, она часто может показывать свою первоначальную устаревшую копию.
Наконец, я должен отметить, что использование этой директивы вообще нецелесообразно, поскольку оно, очевидно, оказывает существенное влияние на использование полосы пропускания. Браузер не может даже использовать Etags
, чтобы получить ответ 304 Not Modified
, поскольку он не будет иметь сохраненной копии для использования в случае получения ответа 304
.
Ответ 2
Директива "must-revalidate" применяется только после того, как ответ устарел (RFC2616, с. 14.9.4). Поскольку ответ не содержит ни заголовка "Expires", ни директивы "max-age", браузер, возможно, обработал ответ как еще свежий и, соответственно, вернул кешированную копию. Чтобы предотвратить это, вы должны включить "max-age: 0" в заголовок Cache-Control (и, возможно, заголовок Expires, содержащий дату в прошлом), так что кеш-ответ немедленно закроется. В качестве альтернативы для предотвращения кэширования используйте директиву "no-cache" вместо "must-revalidate".
Ответ 3
Директива кэша no-store
может использоваться для указания браузеру не писать страницы в кэш диска. В сочетании с no-cache
это должно гарантировать, что все браузеры будут извлекать ресурсы из восходящего, а не из диска.
Cache-Control: private, no-cache, no-store