pavelkarinin
@pavelkarinin
Full Stack Web Developer

Почему Chrome отдаёт локальный кэш при back и forward навигации (кнопками) игнорируя заголовки Cache-Control со значениями: must-revalidate, no-cache?

Возможно я что-то делаю не так или чего-то не понимаю... но ситуация следующая: web-приложение (ASP.NET) функционирующее на сервере (IIS 10) для определенных страниц создает зависимости (CacheDependency), при изменении которых связный с зависимостью ресурс (страница) перестает быть актуальной, возвращает клиенту свежую версию с заголовками:
Cache-Control: private, no-cache, must-revalidate, max-age=0
Last-Modified: Sun, 06 Aug 2017 18:03:49 GMT

... и это хорошо и правильно работает во всех браузерах, но лишь до тех пор пока клиент не ткнет кнопки навигации Back/Forward, в этом случае браузер отдает ресурс from disk cache. Для наглядности продемонстрирую заголовки для трех ситуаций.

1. Первое обращение к серверу за ресурсом:

REQUEST
GET [url] HTTP/1.1
Host: [host]
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
DNT: 1
Referer: [refer]
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4

RESPONSE
HTTP/1.1 200 OK
Cache-Control: private, no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Last-Modified: Sun, 06 Aug 2017 18:03:49 GMT
X-XSS-Protection: 1; mode=block
X-Frame-Options: sameorigin
X-Content-Type-Options: nosniff
Date: Mon, 07 Aug 2017 10:52:00 GMT
Content-Length: 3323

2. Повторный запрос ресурса (при условии, что запрошенный ресурс на сервере не изменился)

REQUEST
GET [url] HTTP/1.1
Host: [host]
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
Accept: text/css,*/*;q=0.1
DNT: 1
Referer: [referer]
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
If-Modified-Since: Sun, 06 Aug 2017 18:03:49 GMT

RESPONSE
HTTP/1.1 304 Not Modified
Cache-Control: private, no-cache, must-revalidate, max-age=0
Accept-Ranges: bytes
Last-Modified: Sun, 06 Aug 2017 18:03:49 GMT
Date: Mon, 07 Aug 2017 10:53:00 GMT

3. Запрос ресурса после навигации через кнопку Back: ресурс на сервере изменился или не изменился, уже не важно, так как браузер не отсылает запрос, а использует собственный кэш, выдавая такой ответ
Request URL:[url]
Request Method:GET
Status Code:200 OK (from disk cache)

на этот якобы-запрос
! Provisional headers are shown
Referer:[referer]
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36


Не могу понять в чем дело, помогите разобраться, необходимо добиться чтобы вне зависимости от того через какое действие (через кнопки или по ссылке, прямой ввод адреса в адресную строку и т.д.) браузер сверялся бы с заголовками отдаваемыми сервером и только после принимал решение: выдавать ресурс из собственного кэша (если узнал, что на сервере он остался актуальным) или загрузил бы свежую версию, узнав о том, что на сервере она появилась, т.е. собственная (браузерная) копия перестала быть актуальной. Спасибо.
  • Вопрос задан
  • 1095 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Искра Екатеринбург
от 80 000 до 100 000 ₽
Art gorka Санкт-Петербург
от 60 000 ₽
от 40 000 до 60 000 ₽
19 апр. 2024, в 22:48
100 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект