HTTP缓存混乱

Kei*_*ith 11 iis iis-7 caching http

我不确定这是否是服务器问题,或者我是否无法理解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>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是浏览器(经过测试的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>
Run Code Online (Sandbox Code Playgroud)

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

所以看起来浏览器已经发送ETag回来(作为资源的唯一ID),服务器返回304 Not Modified - 告诉浏览器它可以使用以前下载的文件.

在我看来,这对许多缓存情况都是正确的,但在这里我不想要额外的往返.当服务器上的文件发生变化时,我不关心图像是否过时.

有很多这些文件(即使使用精灵地图等),我们的许多客户都有非常慢的网络.对于该304状态执行ping的每次往返大约需要10到5秒.许多人也有IE6,一次只有2个HTTP连接.最终结果是我们的应用程序对于这些客户端来说似乎非常慢,每个页面花费额外的几秒钟来检查静态内容是否未发生变化.

我遗漏了什么响应标题会导致浏览器积极地缓存文件?

我如何在IIS7的.Net web.config中设置它?

我是否误解了HTTP缓存的工作原理?

Gar*_*ary 6

您需要使用Expires指令,否则浏览器将始终检查内容是否已更新.

如果缓存条目具有有效的到期日期,则浏览器可以重新使用该内容,而无需在重新访问页面或站点时完全联系服务器.这大大减少了频繁访问的页面的网络往返次数.例如,Google徽标设置为在2038年到期,只会在您第一次访问google.com时下载,或者如果您清空了浏览器缓存.如果他们想要更改图像,他们可以使用不同的图像文件名或路径.

要在IIS7中更改使用以下内容.如果将静态内容保留在特定目录中,则最容易管理.

登录到服务器
打开IIS管理器(开始 - >管理工具 - > iis管理器
展开服务器节点
展开站点节点
打开站点并导航到要更改的目录
打开IIS HTTP响应标题部分
单击设置公用标题右侧的任务窗格
根据您的应用需要设置"过期Web内容".


sus*_*ani 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>
Run Code Online (Sandbox Code Playgroud)