我使用nginx和Dojo构建由一组JSON文件驱动的嵌入式UI。我们的主要目标浏览器是Chrome,但它应该适用于所有现代浏览器。
更改JSON文件可以彻底改变UI,我使用它来为不同的用户提供不同的演示文稿。有关详细信息,请参阅我之前的问题(Configure nginx to return different files to different authenticated users with the same 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
对我来说这看起来非常有说服力,但问题仍然出现在Chrome 36 for OS X和Opera 24 for OS X上(尽管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也会出现问题,这很奇怪。)
答案 0 :(得分:2)
我遇到了同样的问题,json被缓存了......
如果您控制客户端应用程序代码,可能的解决方法是在URL的末尾添加随机值查询参数。
所以不要打电话:
http://XXXXXXXXXXXXXXX/app/resources/screens.json
你打电话,例如:
http://XXXXXXXXXXXXXXX/app/resources/screens.json?rand=rrrrrrrrrr
其中rrrrrrrrrr
是每个调用中不同的随机值。
然后,浏览器将无法重用任何缓存的值。
答案 1 :(得分:1)
我相信我发现了这个问题。显然"缓存控制:无缓存"不足以告诉浏览器,嗯,不缓存数据。我添加了#34; no-store":
Cache-Control:no-store, no-cache
这就是诀窍。不再通过Chrome或Opera进行缓存。