我不确定这是否是服务器问题,或者我是否无法理解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 - 告诉浏览器它可以使用以前下载的文件。
在我看来,这对许多缓存情况都是正确的,但在这里我不想要额外的往返。当服务器上的文件发生变化时,我不在乎图像是否过时。
有很多这些文件(即使使用精灵地图等),我们的许多客户都有非常慢的网络。对于 304 状态执行ping操作的每次往返大约需要10到5秒。许多人也有IE6,一次只有2个HTTP连接。最终结果是我们的应用程序对于这些客户端来说似乎非常慢,每个页面花费额外的几秒钟来检查静态内容是否没有改变。
我错过了什么样的响应标题会导致浏览器积极地缓存文件?
我如何在IIS7的.Net web.config中设置它?
我是否误解了HTTP缓存的工作原理?
答案 0 :(得分:6)
您需要使用Expires指令,否则浏览器将始终检查内容是否已更新。
如果缓存条目具有有效的到期日期,则浏览器可以重复使用该内容,而无需在重新访问页面或网站时完全联系服务器。这大大减少了频繁访问的页面的网络往返次数。例如,Google徽标设置为在2038年到期,只会在您第一次访问google.com时下载,或者如果您清空了浏览器缓存。如果他们想要更改图像,他们可以使用不同的图像文件名或路径。
要在IIS7中更改使用以下内容。如果将静态内容保存在特定目录中,这是最容易管理的。
登录服务器
打开IIS管理器(开始 - &gt;管理工具 - &gt; iis manager
展开服务器节点
展开站点节点
打开站点并导航到要更改的目录
打开IIS HTTP响应标头部分
单击右侧任务窗格上的“设置公共标题”
根据您的应用需要设置“过期网页内容”。
答案 1 :(得分:5)
使用expires标头而不是使用cache-control。第一次从我的浏览器缓存向我提供内容,直到此到期日为止。在到期日之前,不会对文件中的更改进行交叉检查。
在web.config的system.webServer部分中添加标题,如下所示:
<system.webServer>
<staticContent>
<clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT"
cacheControlMode="UseExpires" />;
</staticContent>
</system.webServer>
答案 2 :(得分:-1)
Short anwser:删除Etag并使用Expire标题。
您应该查看35 Yahoo Performance best practices,更具体地说:
对于每个规则,它们通常涵盖Apache和IIS Web服务器配置。
编辑:好的,看起来没有简单的方法来删除IIS中的Etags,besides installing some 3rd party software ...