我的问题是:有时浏览器会过度缓存一些资源,即使我已经修改过它们。但是在F5之后,一切都很好。
我整个下午都研究过这个案子。现在我完全理解“Last-Modified”或“Cache-Control”的观点。我知道如何解决我的问题(只是.js?版本或显式max-age = xxxx)。但问题仍未解决:浏览器如何处理响应标头没有“Cache-Control”,如下所示:Content-Length: 49675
Content-Type: text/html
Last-Modified: Thu, 27 Dec 2012 03:03:50 GMT
Accept-Ranges: bytes
Etag: "0af7fcbdee3cd1:972"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Thu, 24 Jan 2013 07:46:16 GMT
当他们“在栏中输入”
时,他们会清楚地缓存它们
答案 0 :(得分:15)
RFC 7234详细说明默认情况下浏览器和代理应执行的操作:
虽然缓存是HTTP的完全可选功能,但它可以 假设重用缓存的响应是可取的,并且这样 当没有要求或本地时,重用是默认行为 配置阻止它。因此,HTTP缓存要求是 专注于防止缓存存储不可重用的 不恰当地响应或重用存储的响应,而不是 强制要求缓存始终存储和重用特定的响应。
答案 1 :(得分:11)
默认情况下,通常会在浏览器中启用缓存,因此可以使用cache-control
来自定义此行为或将其禁用。
尽管缓存是HTTP的完全可选功能,但可以假设重用缓存的响应是可取的,并且当没有需求或本地配置阻止它时,这种重用是默认行为。因此,HTTP缓存要求的重点是防止缓存存储不可重用的响应或不恰当地重用存储的响应,而不是强制缓存始终存储和重用特定的响应。 [https://tools.ietf.org/html/rfc7234#section-2]
浏览器认为缓存响应新鲜的时间通常与上次修改后的时间相关:
由于源服务器并不总是提供明确的到期时间,因此缓存可以在未指定显式时间时指定启发式到期时间,使用使用其他头字段值的算法(例如Last-Modified时间)...如果响应具有Last-Modified头字段([RFC7232]的第2.2节),则鼓励缓存使用启发式到期值,该值不超过自该时间以来间隔的某个部分。此分数的典型设置可能是10%。 [https://tools.ietf.org/html/rfc7234#section-4.2.2]
This post详细说明了不同浏览器如何计算该值。
答案 2 :(得分:7)
默认缓存控制标头为:私有
缓存机制可以将此页面缓存在专用缓存中,并仅将其重新发送到单个客户端。 这是默认值。大多数代理服务器都不会使用此设置缓存网页。
请参阅http://msdn.microsoft.com/en-us/library/ms524721%28v=vs.90%29.aspx
答案 3 :(得分:3)
新鲜度寿命是根据几个标题计算的。如果" Cache-control:max-age = N"指定了标题,然后新鲜度生命周期等于N.如果不存在这个标题(通常是这种情况),则检查是否存在Expires标题。如果存在Expires标头,则其值减去Date标头的值将确定新鲜度生存期。最后,如果两个标头都不存在,请查找Last-Modified标头。如果存在此标头,则缓存的新鲜度生命周期等于Date标头的值减去Last-modified标头的值除以10。
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ
答案 4 :(得分:0)
如果没有缓存控制标头,浏览器每次加载新的(?)页面时都会请求资源。点击F5你无效(甚至逻辑删除)该页面中的任何缓存项目,因为没有可用的本地版本强制完成重新加载 - 我不确定浏览器是否会在再次请求它们之前从缓存中删除这些资源。
有趣的是,某些浏览器中存在一些“附加”设置会导致一些优化,例如每页加载仅请求一次资源。如果您的每个请求(如计数器)都有一个更改的图像,即使您多次使用该图像,也只能看到该图像的一个版本。
下一个是浏览器通过应用某种本地“首选”缓存重用未明确设置为nocache的图像。如果您希望每次需要将其设置为重新验证并将expired设置为-1或类似的东西时都有请求。
因此,根据指定的资源,通常会触发一些与读取规范时不同的默认值。
关于源是显示本地,驱动器还是真正的远程互联网服务器,可能还有不同的行为。据说并非所有的浏览器都采用不同的方式,而且我非常有限。
有助于查看www.google.com并查找其网页请求的跟踪像素(来自metrics.gstats.com的两个1x1像素,子域上随机部分)。
如果您使用firebug检查标题,您会看到它们以任何可能的方式指定nocache指令。标题如下:
Alternate-Protocol 443:quic
Cache-Control no-cache, must-revalidate
Content-Length 35
Content-Type image/gif
Date Mon, 25 Nov 2013 14:33:30 GMT
Expires Fri, 01 Jan 1990 00:00:00 GMT
Last-Modified Tue, 14 Aug 2012 10:47:46 GMT
Pragma no-cache
Server sffe
X-Content-Type-Options nosniff
X-Firefox-Spdy 3
X-XSS-Protection 1; mode=block
尝试将其设置为设置,并检查这是否解决了浏览器未获取更改资源的问题。 must-revalidate指令甚至会导致代理缓存每次都请求资源并检查304 Not Modified回复。
我目前遇到类似的事情。我有一个localhost连接设置etag,所有发生的事情是缓存永远不会问。我没有设置缓存信息或类似信息。单独指定etag接缝以使FireFox不再请求资源。所以我遇到了类似于你问题的东西。
答案 5 :(得分:0)
在您的情况下,您在响应标头中有Etag: "0af7fcbdee3cd1:972"
,因此它也被缓存了。