2011-11-28 265 views
35

我有这头由服务器发送到客户端:Chrome浏览器不发送的If-Modified-Since标题到服务器

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 

我想在客户端验证该文件,都没有改变服务器并发送一个“200”,如果它有其他的“304”。

火狐发送:

if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT 
if-none-match: "12341234" 

为什么不属于Chrome发送相同页面的刷新?我在.Net运行的行为之后:

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate) 
+0

我不明白“的行为后,我就是.Net运行:“。你可以编辑它吗?这个问题对我很重要。 –

+0

这是一个让你在.Net中的':'后面运行代码的行为。看着这些标签,我试图模仿node.js中的行为。 – Asken

+0

对于所有认为这是客户端问题并对这些答案投票的人。请阅读下面的内容:这与服务器相关,因为我在使用etag('if-none-match')发出浏览器请求之后。 etag是在服务器端创建的,与客户端无关。我需要知道的是从服务器发送到客户端的内容,以使它也可以通过chrome发送etag头文件。所选答案是唯一正确的答案,因为它告诉服务器也发送'if-none-match'。 – Asken

回答

9

根据我的经验,您需要的不仅仅是“专用”缓存控制标头。您需要“Max-Age”或“Expires”强制Chrome重新验证服务器的内容。

请记住,重新验证只会在这些时间值过去后才开始,因此可能需要将其设置为较小的值。

+0

我试过cache-control:private,max-age = 0。没有工作......任何其他想法?我也添加了过期标题,但仍然没有去。 – Asken

+0

其实......应该是max-age = 100000什么的。几乎得到它的工作。让它发送if-none-match有些时候,这是它的行为。谢谢! – Asken

+0

我通常将Max-age设置为1小时,但完全取决于您更新静态内容的频率。如果不确定保持低价值是否安全。 –

53

在昨天花了半天时间之后,我追查了是什么导致了我的问题。只要您点击F12时弹出的Chrome对象检查器/客户端调试器/网络监视器/事物,Chrome就不会发送缓存请求标头。期。 (更新:在较新版本的Chrome中,有一个复选框“禁用缓存”)。即使你没有打开“网络”选项卡(例如:打开javascript控制台),该复选框仍会禁用所有缓存。

令人伤心的是,因为从客户端进行调试必须让您打开网络面板以查看正在发送和接收哪些标头以及正在返回哪些代码。如果没有打开网络面板,则无法知道您的内容是否从客户端缓存。

如果您深入了解服务器访问日志,您会注意到在您关闭Chrome客户端上的调试窗口时,服务器会返回304s(缓存内容)。希望这可以帮助。

的Chrome 24.0.1312.57

+43

开发工具有一个选项“禁用缓存(DevTools打开时)”,也许你已经启用了?点击右下角的'齿轮'图标并检查您的设置。 – Neek

+0

+1(是的,你需要取消选中“Disable cache(DevTools is open)”)。 –

+2

这不是答案,答案与服务器有关。 – Asken

24

我找到一个答案,这种行为使用HTTPS时,想我会分享我发现了什么。您不指定是否通过HTTP或HTTPS请求。

“规则其实很简单:任何证书错误都意味着页面不会被缓存。”

https://code.google.com/p/chromium/issues/detail?id=110649

如果您使用的是自签名证书,即使你在Chrome中添加一个例外它使页面加载时,从该页面没有资源将被缓存,并且请求也不会有一个If-Modified-Since标题。

+0

这似乎不再是真的。我有一个浏览器为某些资源发送'if-modified-since'标头的页面,并且不会将它们发送给其他人。 – pbanka

+0

与之前的评论相反,我刚刚看到同样的确切行为。 If-Modified-Since没有在我有无效证书的环境中发送,但是当我有一个有效的证书时发送它。 – dmccabe

+0

谢谢,我也有这个问题。 我在开发机器上使用自签名证书进行测试。 作为一项测试,我暂时信任证书,并开始按照您的预期获得304。 – Steviebob

0

我知道这个问题是旧的,但仍然.. 我注意到,铬记得您所做的最后一次刷新。所以如果按ctrl + shift + r(刷新和删除缓存),并按ctrl + r(只是刷新),chrome会继续删除缓存,并且不会在收到的响应中显示304。这是一个解决方法。按ctrl + shift + r,然后转到地址栏,将其聚焦,然后按Enter键。如果您的etags设置正确,并且您的服务器已准备好提供304服务,您将在调试器中看到一个新的响应代码 - 304.因此它可以工作。

+0

这不是客户端问题... – Asken

+0

我在多个网站上观察到此行为。客户端错误与否,知道有时cmd + r可能还不够,这还是很好的。 –

+1

接受的答案将有助于网站不工作,并且不会强制网站用户做他们不应该做的事情。 – Asken

4

另外(https://stackoverflow.com/a/14899869/362780):

F12>设置>常规>禁用缓存(而DevTools是打开的) - >取消此...

+0

未选中禁用缓存,问题依然存在。我正在运行版本58.0.3029.110(64位)。 – Reado

相关问题