【发布时间】:2010-06-07 14:42:02
【问题描述】:
我不确定这是否是服务器问题,或者我是否无法理解 HTTP 缓存的真正工作原理。
我有一个在 IIS7 上运行的 ASP MVC 应用程序。网站中有很多静态内容,包括大量 CSS、Javascript 和图像文件。
对于这些文件,我希望浏览器将它们缓存至少一天 - 我们的 .css、.js、.gif 和 .png 文件很少更改。
我的 web.config 是这样的:
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseMaxAge"
cacheControlMaxAge="1.00:00:00" />
</staticContent>
</system.webServer>
我遇到的问题是浏览器(经过测试的 Chrome、IE8 和 FX)似乎没有像我预期的那样缓存文件。我有默认设置(在 IE 中自动检查较新的页面)。
第一次访问时按预期下载内容
HTTP/1.1 200 OK
Cache-Control: max-age=86400
Content-Type: image/gif
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT
Accept-Ranges: bytes
ETag: "3efeb2294517ca1:0"
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Mon, 07 Jun 2010 14:29:16 GMT
Content-Length: 918
<content>
我认为Cache-Control: max-age=86400 应该告诉浏览器一天不要再次请求该页面。
好的,现在页面重新加载,浏览器再次请求图像。这次它得到一个带有这些标头的空响应:
HTTP/1.1 304 Not Modified
Cache-Control: max-age=86400
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT
Accept-Ranges: bytes
ETag: "3efeb2294517ca1:0"
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Mon, 07 Jun 2010 14:30:32 GMT
所以看起来浏览器已经返回 ETag(作为资源的唯一 ID),而服务器返回一个 304 Not Modified - 告诉浏览器它可以使用之前下载的文件。
在我看来,这对于许多缓存情况都是正确的,但在这里我不想要额外的往返。当服务器上的文件更改时,我不在乎图像是否过时。
这些文件有很多(即使是 sprite-maps 等),而且我们的许多客户的网络都很慢。 304 状态的每次往返 ping 大约需要 10 到 5 秒。许多人还拥有 IE6,它一次只有 2 个 HTTP 连接。最终结果是,对于这些客户端来说,我们的应用程序似乎非常慢,每个页面都需要额外的几秒钟来检查静态内容是否没有改变。
我缺少什么会导致浏览器主动缓存文件的响应标头?
如何在 .Net web.config 中为 IIS7 设置它?
我是否误解了 HTTP 缓存的工作原理?
【问题讨论】:
-
你能禁用 ETag 吗?这可能会解决你的问题,但我不确定。
-
我将尝试删除 ETag,但对于我的测试服务器,它似乎匹配了
-
如果您点击刷新或 F5,浏览器将始终发出服务器请求(可能是条件请求),而不管缓存设置如何
-
@sri 谢谢!就是这样!原来
Expires和Cache-Control工作得一样好,但是 F5/refresh 总是会导致 304 检查再次发生。但这在一个答案中,你可以有一些代表:)