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