Запрос / ответ кэширования браузера без заголовка Cache-Control - PullRequest
1 голос
/ 10 июля 2020

У меня проблема с кешем браузера при использовании веб-приложения SPA и серверной части REST API. Я могу воспроизвести его на Firefox и Safari с открытыми инструментами разработчика: я убедился, что кеш НЕ отключен.

Когда я go сначала перехожу к определенной странице c, которая просто загружает и отображать объект из REST API, я делаю это с помощью «hard refre sh» (CMD + R на Ma c). Я вижу следующие заголовки:

1-й запрос:

Host: localhost:5000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: application/json, text/plain, */*
Accept-Language: en,it;q=0.7,fr;q=0.3
Accept-Encoding: gzip, deflate, br
Origin: http://localhost:3000
DNT: 1
Connection: keep-alive
Referer: http://localhost:3000/literature/sde5e-zeb98
Cookie: ...
If-Modified-Since: Fri, 10 Jul 2020 16:19:24 GMT
If-None-Match: "2"
Cache-Control: max-age=0

(обратите внимание на заголовок Cache-Control, который добавляется автоматически из-за жесткого обновления sh)

Ответ :

HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 6128
ETag: "2"
Last-Modified: Fri, 10 Jul 2020 16:19:24 GMT
Link: <https://localhost:5000/api/documents/sde5e-zeb98>; rel="self"
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 52
X-RateLimit-Reset: 1594398279
Retry-After: 60
X-Frame-Options: sameorigin
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31556926; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Expose-Headers: Content-Type, ETag, Link, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
Access-Control-Allow-Credentials: true
Vary: Origin
Server: Werkzeug/1.0.1 Python/3.6.7
Date: Fri, 10 Jul 2020 16:23:38 GMT

Запрос дошел до серверной части, как ожидалось, я регистрирую его. Бэкэнд возвращает ETag + Last modified заголовков, но не возвращает другие заголовки кеша (например, max-age). Я хочу, чтобы браузер всегда обращался к бэкэнду.

Проблема возникает, когда я не нажимаю аппаратное обновление sh, а просто перехожу на веб-сайт на другую страницу, а затем снова перехожу на эту страницу (не через назад кнопка), в основном обычное использование веб-сайта. Я ожидал, что браузер будет выполнять запрос к бэкэнду каждый раз, бэкэнд возвращает ETag и код состояния 200/304, а браузер соответственно использует кеш клиента (расчет ETag на бэкэнде правильный). Проблема в том, что запрос даже не доходит до бэкэнда, ни один запрос не выполняется, нет бэкэнда, и я не понимаю почему. Я вижу в Firefox значение cached в столбце Transferred.

Ее запрос:

Host: localhost:5000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: application/json, text/plain, */*
Accept-Language: en,it;q=0.7,fr;q=0.3
Accept-Encoding: gzip, deflate, br
Origin: http://localhost:3000
DNT: 1
Connection: keep-alive
Referer: http://localhost:3000/literature/sde5e-zeb98
Cookie: ...

(нет заголовка Cache-Control, это правильно, он должен быть нормальным поведением)

Кешированный ответ (без обращения к бэкэнду):

HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 6128
ETag: "2"
Last-Modified: Fri, 10 Jul 2020 16:19:24 GMT
Link: <https://localhost:5000/api/documents/sde5e-zeb98>; rel="self"
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 52
X-RateLimit-Reset: 1594398445
Retry-After: 60
X-Frame-Options: sameorigin
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31556926; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Expose-Headers: Content-Type, ETag, Link, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
Access-Control-Allow-Credentials: true
Vary: Origin
Server: Werkzeug/1.0.1 Python/3.6.7
Date: Fri, 10 Jul 2020 16:26:24 GMT

Я пытаюсь понять, какой заголовок мешает браузеру выполнить запрос. У меня нет набора заголовков Cache-Control. Я подозреваю, что это может быть проблема с заголовком Vary, но приветствуются любые подсказки.

Есть идеи, как отлаживать, почему браузер кэширует запрос? Какой заголовок не так? Спасибо!

1 Ответ

3 голосов
/ 11 июля 2020

Отсутствие Cache-Control или Expires не означает, что кеширование отключено; это означает, что браузер может реализовать свою собственную политику кэширования. Как описано в RF C 7234 :

Поскольку исходные серверы не всегда предоставляют явное время истечения срока действия, кеш МОЖЕТ назначить время истечения срока действия эвристической c, когда явное время не указан, используя алгоритмы, которые используют другие значения поля заголовка (например, Last-Modified время) для оценки вероятного времени истечения.

Политика кэширования , которую вы действительно хотите, это Cache-Control: no-cache, так что верните это.

Ответ может храниться в любом кэше, даже если ответ обычно не кэшируется. Однако сохраненный ответ ДОЛЖЕН всегда go через проверку на исходном сервере перед его использованием.

...