У меня проблема с кешем браузера при использовании веб-приложения 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
, но приветствуются любые подсказки.
Есть идеи, как отлаживать, почему браузер кэширует запрос? Какой заголовок не так? Спасибо!