我正在使用nginx和Dojo构建一个嵌入式UI,由一组JSON文件驱动。我们的主要目标浏览器是Chrome,但它应该可以与所有现代浏览器一起使用。
更改JSON文件可以大大改变UI,我利用这一点为不同的用户提供不同的演示文稿。有关详细信息,请参见我的先前问题(配置nginx以返回不同的文件给具有相同URI的不同经过身份验证的用户),但基本上我的nginx配置是这样的,即具有不同用户的相同URI可能会产生不同的内容。
这一切都很好,除了当有人切换到不同的用户时。一些浏览器将从其自己的内部缓存中获取这些JSON文件,甚至不与服务器进行检查,这会导致UI显示先前用户的演示文稿。重新加载页面可以解决此问题,但是!我宁愿正确的事情自动发生。
明显的解决方案是使用各种缓存头,但它们似乎没有帮助。我正在使用以下nginx指令:
这对我来说看起来非常确定,但问题仍然在OS X的Chrome 36和Opera 24以及Firefox 29和32上出现。Chrome只会从缓存中获取文件,甚至不会引用服务器。
以下是一个详细的示例,其中包含从Chrome的网络调试面板中提取的标题。第一次Chrome获取/app/resources/states.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也有这个问题。)