Chrome浏览器未向服务器发送if-modified-since标头

Ask*_*ken 40 http cache-control http-headers node.js

我将这些标头由服务器发送到客户端:

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
Run Code Online (Sandbox Code Playgroud)

我希望客户端验证文件在服务器上没有更改,如果否则为"304",则发送"200".

Firefox发送:

if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT
if-none-match: "12341234"
Run Code Online (Sandbox Code Playgroud)

为什么Chrome不会在刷新页面时发送相同内容?我正在追踪.Net运行的行为:

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate)
Run Code Online (Sandbox Code Playgroud)

小智 58

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

很遗憾,因为从客户端进行调试会使您无需打开网络面板以查看正在发送和接收的标头以及正在返回的代码.如果没有打开网络面板,则无法知道您的内容是否正在从客户端缓存.

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

Chrome 24.0.1312.57

  • 开发工具有一个选项"禁用缓存(当DevTools打开时)",也许你启用了?点击右下角的"齿轮"图标,然后检查您的设置. (44认同)
  • 这不是答案,答案与服务器有关. (2认同)
  • 这个答案是一个很好的线索(它确实导致了解决方案,这在Neek的评论中),但不幸的是它是错误的.没有devtools打开阻止标题; 它正在检查"禁用缓存".@ Neek的评论是真正的答案,他/她应该考虑将其作为答案. (2认同)
  • 如果我理解正确,答案不能与服务器相关,因为`If-Modified-Since`是请求标头.因此,它必须由客户发送. (2认同)

Nee*_*eek 31

我在使用HTTPS时找到了这种行为的答案,我想我会分享我发现的内容.您没有指定是通过HTTP还是HTTPS请求.

"规则实际上非常简单:证书的任何错误都意味着页面不会被缓存."

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

如果您使用自签名证书,即使您告诉Chrome为其添加例外以便加载页面,也不会缓存该页面中的资源,并且后续请求将不具有If-Modified-Since标头.

  • 为你竖起大拇指!4 年后,*this* 似乎是正确的答案。在具有自签名/忽略证书的本地环境中工作时,Chrome 永远不会发送“If-None-Match”标头。 (2认同)

And*_*age 12

根据我的经验,您需要的不仅仅是"私有"Cache-Control标头.您需要"Max-Age"或"Expires"才能强制Chrome重新验证服务器的内容.

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