尽管服务器在响应标头中发送了 no-cache、no-store、must-revalidate 信息,但我的浏览器仍显示缓存页面

尽管服务器在响应标头中发送了 no-cache、no-store、must-revalidate 信息,但我的浏览器仍显示缓存页面

我们网页上的内容不断变化,因此我们不希望浏览器缓存页面或显示缓存页面或用户。但尽管服务器在响应标头中发送了 no-cache、no-store、must-revalidate,浏览器仍不断显示缓存页面。这真是令人沮丧。我们有成千上万的用户,他们都在阅读旧新闻!!!

我们正在使用客户端 js 模板 (handlebars js) 从服务器读取数据并呈现页面,但浏览器一直向用户显示最后呈现的页面,handlebars 既没有从服务器读取新数据,也没有更新内容。可能出了什么问题?

如果我按下 shift reload 键,那么浏览器确实会显示新内容,但我不能要求或期望我的用户每次加载我们的页面时都这样做。

有人能给出有用的指点吗?

200 正常

响应头:

Accept-Ranges: bytes
Cache-Control: no-cache, no-store, must-revalidate
Connection: keep-alive
Content-Length: 12229
Content-Type: text/html
Date: Fri, 14 Aug 2020 09:08:10 GMT
ETag: "1e9602c3ddcf81c338fa4194c61ea035"
Last-Modified: Fri, 07 Aug 2020 12:38:22 GMT
Server: nginx/1.19.1
Strict-Transport-Security: max-age=0; includeSubDomains
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id: tx00000000000004b9d2b06-005f36547a-ab8956-ams3b
x-rgw-object-type: Normal

请求标头:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
Cookie: _ga=GA1.1.709310680.1596978913; _gid=GA1.1.2045080055.1596978913
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36
(index):48 [Violation] Avoid using document.write(). https://developers.google.com/web/updates/2016/08/removing-document-write

​ 我们正在执行 http GET,因为 nginx 前面会有 cloudflare,它将执行 tls 终止并对我们的 nginx 执行正常的 http get。我害怕想到一旦我们在 cloudflare 上线,cloudflare 缓存会引入什么其他缓存问题。我们需要在几天内上线,并且需要在使用此版本投入生产之前解决这个问题。非常感谢在这方面的快速帮助来解决上述问题。提前致谢。

答案1

您已使用Cache-Control 指令这些指令相互冲突,因此浏览器必须决定遵循哪些指令以及忽略哪些指令。

具体来说,你使用了:

  • no-cache。这实际上允许缓存响应,尽管它会立即被标记为陈旧,并且始终通过原始服务器进行重新验证。
  • must-revalidate:仅表示必须使用原始服务器重新验证过期的缓存文档。no-cache此处暗示没有其他效果。
  • no-store:不要缓存响应。

当您说不要缓存但缓存也是可以的时,浏览器会做什么?

如果你不想缓存响应,请使用仅有的 no-store. 不要使用另外两个 Cache-Control 指令。

相关内容