Chrome过度缓存从nginx服务器提供的.json文件

3
我正在使用nginx和Dojo构建一个嵌入式UI,由一组JSON文件驱动。我们的主要目标浏览器是Chrome,但它应该可以与所有现代浏览器一起使用。
更改JSON文件可以大大改变UI,我利用这一点为不同的用户提供不同的演示文稿。有关详细信息,请参见我的先前问题(配置nginx以返回不同的文件给具有相同URI的不同经过身份验证的用户),但基本上我的nginx配置是这样的,即具有不同用户的相同URI可能会产生不同的内容。
这一切都很好,除了当有人切换到不同的用户时。一些浏览器将从其自己的内部缓存中获取这些JSON文件,甚至不与服务器进行检查,这会导致UI显示先前用户的演示文稿。重新加载页面可以解决此问题,但是!我宁愿正确的事情自动发生。
明显的解决方案是使用各种缓存头,但它们似乎没有帮助。我正在使用以下nginx指令:
expires epoch;
etag off;
if_modified_since off;
add_header Last-Modified "";

...这将生成以下响应标头:

HTTP/1.1 200 OK
Server: nginx/1.4.1
Date: Wed, 24 Sep 2014 16:58:32 GMT
Content-Type: application/octet-stream
Content-Length: 1116
Connection: keep-alive
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Cache-Control: no-cache
Accept-Ranges: bytes

这对我来说看起来非常确定,但问题仍然在OS X的Chrome 36和Opera 24以及Firefox 29和32上出现。Chrome只会从缓存中获取文件,甚至不会引用服务器。
以下是一个详细的示例,其中包含从Chrome的网络调试面板中提取的标题。第一次Chrome获取/app/resources/states.json时,Chrome报告:
Remote Address:75.144.159.89:8765
Request URL:http://XXXXXXXXXXXXXXX/app/resources/screens.json
Request Method:GET
Status Code:200 OK

使用请求头:

Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Authorization:Basic dm9sdGFpcndlYjp2b2x0YWly
Cache-Control:max-age=0
Connection:keep-alive
Content-Type:application/x-www-form-urlencoded
DNT:1
Host:suitable.dyndns.org:8765
Referer:http://XXXXXXXXXXXXXXXXXXXXXX/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
X-Requested-With:XMLHttpRequest

以及响应头:

Accept-Ranges:bytes
Cache-Control:no-cache
Connection:keep-alive
Content-Length:2369
Content-Type:application/octet-stream
Date:Wed, 24 Sep 2014 17:19:46 GMT
Expires:Thu, 01 Jan 1970 00:00:01 GMT
Server:nginx/1.4.1

再次说明,一切都很好。但是,当我更改用户(通过重新启动Chrome然后重新加载父页面)时,我会得到以下Chrome报告:

Remote Address:75.144.159.89:8765
Request URL:http://suitable.dyndns.org:8765/app/resources/states.json
Request Method:GET
Status Code:200 OK (from cache)

与服务器似乎没有明显联系。

这种情况好像不是对所有文件都发生。一些.js文件被缓存,大多数文件未被缓存;所有.css文件似乎都没有被缓存;所有.html文件都被缓存,所有.json文件都被缓存。

我如何告诉浏览器(我在看你,Chrome!)这些文件在请求时是最新的,但以后再也不会是最新的呢?这是Chrome的问题吗?(如果是,那么很奇怪Opera也有这个问题。)

2个回答

3

我相信我找到了问题所在。显然,仅仅使用"Cache-Control: no-cache"无法告诉浏览器不缓存数据。我添加了"no-store":

Cache-Control:no-store, no-cache

这样就可以解决问题了。Chrome和Opera不会再缓存了。


这个参数是在Web服务器配置中设置的吗? - Rop

3

我曾经遇到过相同的问题,即json被缓存了...

如果你控制客户端应用程序代码,一个可能的解决方法是在URL末尾添加一个随机值的查询参数。

所以不要直接调用:

http://XXXXXXXXXXXXXXX/app/resources/screens.json

例如,您可以调用:

http://XXXXXXXXXXXXXXX/app/resources/screens.json?rand=rrrrrrrrrr

其中rrrrrrrrrr是每次调用时都不同的随机值。

因此,浏览器将无法重复使用任何缓存值。


2
非常好,jQuery的实现也使用了这种方法,通过在URL中添加?_=(new Date()).getTime() - Memet Olsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接