我正在尝试使用Cache-Control
为我的webapp中的REST端点配置缓存,它在本地工作,但是当我在生产服务器上部署时,浏览器就不会缓存响应。
通过参数化的ajax请求查询端点(如下所示)。
一些相关说明:
我使用 cache buster 参数(_
),该参数是在页面加载时生成的unix时间戳。它不会在ajax请求中发生变化。
localhost在HTTP上,而生产在HTTPS上。证书有效且没有相关错误。
Firefox 59.0.2和Chrome 66.0.3359.139都出现此行为,因此我认为这是配置中的内容。
Request URL: http://localhost:8080/webapp/rest/events?_=1525720266960&start=2018-04-29&end=2018-06-10
Request Method: GET
Status Code: 200 OK
Referrer Policy: no-referrer-when-downgrade
=== Request ===
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: JSESSIONID=<token>
Host: localhost:8080
Referer: http://localhost:8080/webapp/
X-Requested-With: XMLHttpRequest
=== Response ===
Cache-Control: no-transform, max-age=300, private
Connection: keep-alive
Content-Length: 5935
Content-Type: application/json
以下请求(针对相同的参数)从缓存中有效加载,唯一的区别是:Status Code: 200 OK (from disk cache)
这似乎很好,因为我不想重新验证。只有在max-age
指定的Cache-Control
持续时间过后,资源才会在没有验证的情况下再次获取。
Request URL: https://www.example.org/webapp/rest/events?_=1525720216575&start=2018-04-29&end=2018-06-10
Request Method: GET
Status Code: 200 OK
Referrer Policy: no-referrer-when-downgrade
=== Request ===
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: JSESSIONID=<token>
Host: www.example.org
Referer: https://www.example.org/webapp/
X-Requested-With: XMLHttpRequest
=== Response ===
Cache-Control: no-transform, max-age=300, private
Connection: close
Content-Length: 5935
Content-Type: application/json
在这种情况下,之后永远不会从缓存加载响应。
我删除了一些我认为多余的标题(Server
,X-Powered-By
,User-Agent
,Date
)。
什么可以防止浏览器在与生产服务器通信时缓存响应?
答案 0 :(得分:0)
2天后我再试一次,缓存工作正常。 (我发誓我不是疯了)
相同的请求,相同的标题,相同的响应。
我怀疑它属于某种启发式,会覆盖响应Cache-Control
。
这肯定与此端点之前没有指定Cache-Control
这一事实有关,因此浏览器忽略了标题,因为启发式有利于重新获取而不是缓存,因此更加谨慎是不会出错的。
13.2.2启发式过期
由于源服务器并不总是提供明确的到期时间, HTTP缓存通常分配启发式到期时间,使用 使用其他标头值的算法(例如Last-Modified 时间)估计合理的到期时间。 HTTP / 1.1 规范没有提供具体的算法,但确实强加了 对结果的最坏情况限制。自启发式到期 时间可能会损害语义透明度,他们应该使用它们 谨慎,我们鼓励原始服务器提供明确的 到期时间尽可能多。
总而言之,这是我的最佳解释。