我将这些标题由服务器发送到客户端:
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 27 Nov 2011 11:10:38 GMT
ETag:"12341234"
Set-Cookie:connect.sid=e1u...7o; path=/; expires=Sun, 27 Nov 2011 11:40:38 GMT; httpOnly
Transfer-Encoding:chunked
last-modified:Sat, 26 Nov 2011 21:42:45 GMT
我希望客户端验证服务器上的文件没有更改,如果否则为“304”,则发送“200”。
Firefox发送:
if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT
if-none-match: "12341234"
为什么Chrome不会在页面刷新时发送相同内容?我正在追踪.Net已经运行的行为:
context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate)
答案 0 :(得分:57)
昨天花了半天时间,我跟踪了导致这个问题的原因。只要您点击F12时弹出Chrome对象检查器/客户端调试器/网络监视器/ Thing,Chrome就不会发送缓存请求标头。期。 (更新:在较新版本的Chrome中,有一个复选框“禁用缓存”)。即使您没有打开“网络”选项卡(例如:打开javascript控制台),此复选框仍会禁用所有缓存。
很遗憾,因为从客户端进行调试会使您无法打开网络面板以查看正在发送和接收的标头以及正在返回的代码。如果没有打开网络面板,则无法知道您的内容是否正在从客户端缓存。
如果您深入了解服务器访问日志,您会注意到您的服务器在您关闭Chrome客户端上的调试窗口时返回304s(缓存内容)。希望这可以帮助。
Chrome 24.0.1312.57
答案 1 :(得分:30)
我在使用HTTPS时找到了这种行为的答案,我想我会分享我发现的内容。您没有指定是通过HTTP还是HTTPS请求。
“规则实际上很简单:证书的任何错误都意味着页面不会被缓存。”
https://code.google.com/p/chromium/issues/detail?id=110649
如果您使用的是自签名证书,即使您告诉Chrome为其添加例外以便加载该页面,也不会缓存该页面中的资源,并且后续请求将不会具有If-Modified-自标题。
答案 2 :(得分:12)
根据我的经验,您需要的不仅仅是“私有”Cache-Control标头。您需要“Max-Age”或“Expires”才能强制Chrome重新验证服务器的内容。
请记住,重新验证只会在经过这些时间值后开始,因此可能需要将它们设置为较小的值。
答案 3 :(得分:4)
另外(https://stackoverflow.com/a/14899869/362780):
F12>设置>一般>禁用缓存(当DevTools打开时) - >取消选中...
答案 4 :(得分:0)
我知道这个问题很老,但仍然...... 我注意到chrome记得你上次刷新了。因此,如果按ctrl + shift + r(刷新和删除缓存),然后按ctrl + r(只刷新),chrome将继续删除缓存,并且不会在收到的响应中显示304。有一个解决方法。按ctrl + shift + r然后转到地址栏,将其对焦,然后按Enter键。如果您的etags设置正确,并且您的服务器已准备好为304服务,您将在调试器中看到一个新的响应代码 - 304。所以它可以工作。
答案 5 :(得分:0)
当涉及到缓存时,浏览器有很多与之相反的直观行为。您会期望,如果响应中包含最后修改日期,浏览器将在重新使用它之前重新验证它。但是,没有哪个主流浏览器真正做到这一点。
适合您情况的理想设置取决于您希望浏览器重新生效的时间,请参见下面的链接。
不仅浏览器的行为直观相反,不同浏览器在相同情况下的行为也不同。例如,当用户单击刷新按钮时。
您可以阅读不同的浏览器(Internet Explorer,Edge,Safari,FireFox,Chrome)在不同的缓存指令(Etag,上次修改,必须重新验证,到期,最大使用期限,无缓存,无-商店)在https://gertjans.home.xs4all.nl/javascript/cache-control.html