在此处对'Expires'标题非常困惑! 有时它按预期工作 - 有时候不会。在Chrome中测试时过期标题
我正在使用以下代码来设置我的过期标题。请注意,这是在ASP.NET中使用MVC自定义属性完成的 - 这里没有真正相关的内容 - 但解释了'filterContext'
的来源。
HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);
// my own custom header so we know what time it was
filterContext.HttpContext.Response.AddHeader("CurrentTime", DateTime.Now.ToString());
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(DateTime.Now.Add(cacheDuration));
cache.SetMaxAge(cacheDuration);
cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
这有时让我头是这样的:
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=413
Date: Wed, 18 Feb 2009 05:24:19 GMT
Expires: Wed, 18 Feb 2009 05:21:12 GMT
CurrentTime: 2/17/2009 9:21:12 PM
有时候是这样的:
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=600
Date: Wed, 18 Feb 2009 05:27:55 GMT
Expires: Wed, 18 Feb 2009 05:27:55 GMT
CurrentTime: 2/17/2009 9:27:55 PM
我通过提琴手运行一切,看的时候看到的东西都重新请求以及何时来自浏览器缓存。
现在怪异的事情是在IE缓存总是按预期工作。我的ASP.NET MVC操作方法的链接出现在Fiddler中,然后当我再次单击相同的链接时,它将从缓存中获取。
但是在Chrome中,它有时会并且有时不会来自缓存!来自缓存我的意思是没有额外的HTTP请求。
比如像这样的链接:
http://ipv4.fiddler:62669/gallery/mainimage/2
将来自于IE缓存,但回来与铬200。然后有时在Chrome中,它来自缓存。我已经尝试清空浏览器缓存并重试 - 每次都有相同的结果。
Chrome是否试图做一些'聪明',只是失败 - 或者我需要额外的头?
什么我不知道是如果有什么关系的事实,我Expires
头日期是从来没有真正的未来。如果我看看他们的hosted jQuery file的谷歌标题,我看到标题如下(在2010年到期 - 在未来一年)。
Cache-Control: public, max-age=31536000
Date: Wed, 18 Feb 2009 05:44:53 GMT
Expires: Thu, 18 Feb 2010 05:44:53 GMT
实际上未来会过期吗?
按照HTTP spec:
如果响应包括一个Expires 报头和最大年龄指令,则 最大年龄指令覆盖的 Expires头,即使过期 报头是更具限制性。此规则 允许原始服务器为给定响应提供 ,向HTTP/1.1(或以后的 )高速缓存提供更长的到期时间,而不是向HTTP/1.0 高速缓存提供更长的到期时间。如果某些 HTTP/1.0缓存不正确计算 年龄或到期时间,可能是由于 到不同步的时钟,这可能是有用的。
因此,即使'Expires'与当前时间相同,Chrome似乎应该尊重max-age指令,但似乎并没有这样做。
我甚至为这个aspx页面添加了<%= DateTime.Now.ToString()%>,并在网络上运行它,并且它每次都返回200,并更新时间。但在IE中它被缓存了33秒。弄乱 – 2009-02-18 07:42:55