您好,欢迎访问一九零五行业门户网

如何在保留 Last-Modifed 的同时让 Chrome 等浏览器不要"from cache"?

我有个web应用,服务器端数据是动态生成的,通过程序在服务器端缓存,用 last-modified 来标明更新时间。但是在 url 上不加随机数的时候,google chrome 总是 from cache 而不向服务器发起请求。只有在浏览器开启 ”isable cache (while devtools is open)“ 才会正常的每次发起请求,服务器返回 304 它才从 cache 取。
我试着加了 cache-control: no-cache, pragma: no-cache 都不行,他总是在第二次就from cache,我又需要用 last-modifed 来减少一些服务器响应的数据量,有什么办法解决这个问题吗?
问题补充:
如果单独请求这个地址,是正常的,第二次、第三次浏览器发出 if-modififed-since,但是当请求是在页面内发出的,比如 则他总是在首次后 from cache,除非加上 expires 让它过期。
发现有人提 bug https://code.google.com/p/chromium/issues/detail?can=2&start=0&num=100&q=&colspec=id%20pri%20m%20iteration%20releaseblock%20cr%20status%20owner%20summary%20os%20modified&groupby=&sort=&id=48445 ,还发现我去年就被这个问题折腾过了(去年在上面留言了)
用etag替代last-modified就不再有问题了,发现google正是这么干的。
回复内容: 我有个web应用,服务器端数据是动态生成的,通过程序在服务器端缓存,用 last-modified 来标明更新时间。但是在 url 上不加随机数的时候,google chrome 总是 from cache 而不向服务器发起请求。只有在浏览器开启 ”isable cache (while devtools is open)“ 才会正常的每次发起请求,服务器返回 304 它才从 cache 取。
我试着加了 cache-control: no-cache, pragma: no-cache 都不行,他总是在第二次就from cache,我又需要用 last-modifed 来减少一些服务器响应的数据量,有什么办法解决这个问题吗?
问题补充:
如果单独请求这个地址,是正常的,第二次、第三次浏览器发出 if-modififed-since,但是当请求是在页面内发出的,比如 则他总是在首次后 from cache,除非加上 expires 让它过期。
发现有人提 bug https://code.google.com/p/chromium/issues/detail?can=2&start=0&num=100&q=&colspec=id%20pri%20m%20iteration%20releaseblock%20cr%20status%20owner%20summary%20os%20modified&groupby=&sort=&id=48445 ,还发现我去年就被这个问题折腾过了(去年在上面留言了)
用etag替代last-modified就不再有问题了,发现google正是这么干的。
好问题,我之前一直不知道还有这么一个坑。不过这不是浏览器的bug。
这里有一个相似的问题 why is this response being cached?
我将回答者 stephen ostermiller 的答案稍微翻译下
如果你添加了 last-modified 首部,但是没有添加 expires 或者 cache-control 首部,浏览器就不得不自行判断它应该将这份资源缓存多久。有些浏览器会将其缓存一天以上。
google caching best practices guide 里说浏览器会根据 last-modified 自行推算缓存时长。
firefox 的推算方法是:缓存时长 = (date - last-modified) / 10。
chrome / safari / ie 并没有公布他们的公式或算法。
此类文件的缓存时长通常取决于以下因素
浏览器开辟的缓存空间大小 用户浏览过的站点数量和大小 用户是否关闭了浏览器 所以,你如果不想删掉 last-modified,又不想浏览器缓存你的资源,就应该显示地指定过期时间或缓存时长。
the end
cache-control: no-cache, no-store, max-age=0pragma: no-cacheexpires: sat, 26 jul 1997 05:00:00 gmt
上面这个是禁止所有缓存的。
不过根据你的描述我更建议这样写
cache-control: max-age=0, private, must-revalidate
点击这里:
然后勾上相关的设置
其它类似信息

推荐信息