在Pylons中禁用浏览器缓存
我有一个动作 /json,它从服务器返回json数据。
可惜的是,在IE浏览器中,它喜欢把这个json数据缓存起来。
我该怎么做才能让这个动作不被缓存呢?
4 个回答
1
这是一个常见的问题——IE浏览器会在客户端缓存所有的ajax/json请求,而其他浏览器则不会。
为了绕过这个问题,可以生成一个随机数,并把它作为变量添加到你的请求网址后面。这样可以让IE误以为这是一个新的请求。
下面是一个用javascript写的例子,你在Python中也可以做类似的操作:
function rand() {
return Math.floor(Math.random()*100000);
}
$("#content").load("/posts/view/1?rand="+rand());
3
确保你的响应头包含:
Cache-Control: no-cache
Pragma: no-cache
Expires=-1
2
确保你的响应没有告诉浏览器内容在未来会过期。有两个HTTP头部可以控制这个。
- Expires(过期时间)
- Cache-Control(缓存控制) - 这个头部有很多可能的值,但控制过期的那个是 max-age=foo。
另外,IE浏览器可能会进行重新验证。这意味着IE在请求中会包含一些额外的信息,告诉网络服务器它缓存的资源版本。如果浏览器缓存的版本是最新的,你的服务器可以用 304 Not Modified
来响应,而不需要包含内容在响应中。“条件GET请求”就包含了这个版本信息。可能你的服务器在不该返回304响应的时候却返回了。
有两组头部控制重新验证:
- Last-Modified(最后修改时间) + If-Modified-Since(如果修改过)
- ETag + If-None-Match(如果不匹配)
Last-Modified和ETag是响应头,告诉浏览器它即将接收的资源版本。如果你不想让浏览器进行重新验证,就不要设置这些。If-Modified-Since和If-None-Match是对应的请求头,浏览器用它们来报告需要与服务器重新验证的过期资源版本。
有各种工具可以查看你的服务器发送给浏览器的HTTP头部。其中一个是Firefox的扩展 Live HTTP Headers。另一个工具是 Steve Sounders 推荐的 IBM Page Detailer。我自己没有试过这个,但它不依赖于你使用的浏览器。