HTTP Cache-Control标头仅适用于localhost

时间:2018-05-07 19:46:42

标签: ajax http caching https browser-cache

我正在尝试使用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

在这种情况下,之后永远不会从缓存加载响应。

我删除了一些我认为多余的标题(ServerX-Powered-ByUser-AgentDate)。

问题

什么可以防止浏览器在与生产服务器通信时缓存响应?

1 个答案:

答案 0 :(得分:0)

2天后我再试一次,缓存工作正常。 (我发誓我不是疯了)

相同的请求,相同的标题,相同的响应。

我怀疑它属于某种启发式,会覆盖响应Cache-Control

这肯定与此端点之前没有指定Cache-Control这一事实有关,因此浏览器忽略了标题,因为启发式有利于重新获取而不是缓存,因此更加谨慎是不会出错的。

RFC2616

  

13.2.2启发式过期

     

由于源服务器并不总是提供明确的到期时间,      HTTP缓存通常分配启发式到期时间,使用      使用其他标头值的算法(例如Last-Modified      时间)估计合理的到期时间。 HTTP / 1.1      规范没有提供具体的算法,但确实强加了      对结果的最坏情况限制。自启发式到期      时间可能会损害语义透明度,他们应该使用它们      谨慎,我们鼓励原始服务器提供明确的      到期时间尽可能多。

总而言之,这是我的最佳解释。