IIS7缓存控制

时间:2009-03-13 14:27:04

标签: asp.net iis caching iis-7

我正在尝试做一些我认为相当简单的事情。获取IIS 7告诉客户他们可以在我的网站上缓存所有图像一段时间,比方说24小时。

我已尝试http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx上的步骤,但无济于事。我仍然得到返回304s的服务器请求。

有没有人有办法做到这一点?我有一个图形密集型网站,每次他们请求页面时我的用户都被锤击(我的服务器也是如此)。很奇怪,这些图像似乎在Firebug中出现了“Cache-Control private,max-age = 3600”,但当我按下F5时,浏览器仍在请求它们。

6 个答案:

答案 0 :(得分:115)

如果你想设置Cache-Control标头,那么IIS7用户界面中没有任何东西可以做到这一点,遗憾的是。

但是,您可以将此web.config放在要设置它的文件夹或站点的根目录中:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

这将通知客户端在该文件夹和所有子文件夹中缓存内容7天。

您也可以通过appcmd.exe编辑IIS7元数据库来执行此操作,如下所示:

\Windows\system32\inetsrv\appcmd.exe 
  set config "Default Web Site/folder" 
  -section:system.webServer/staticContent 
  -clientCache.cacheControlMode:UseMaxAge

\Windows\system32\inetsrv\appcmd.exe 
  set config "Default Web Site/folder" 
  -section:system.webServer/staticContent 
  -clientCache.cacheControlMaxAge:"7.00:00:00"

答案 1 :(得分:111)

杰夫,这不是真的。

您只需在IIS 7管理器UI中选择一个文件夹(例如图像或事件默认Web应用程序文件夹),然后单击“HTTP响应标头”。然后,您必须在右侧窗格中单击“设置公共标题..”,然后选择“过期Web内容”。在那里,您可以通过选择“After:”,在文本框中输入“24”并在组合框中选择“小时”,轻松配置24小时的最大年龄。

关于web.config条目的第一段是正确的。我将添加cacheControlCustom属性以将缓存控制标头设置为“public”或在这种情况下需要的任何内容。

当然,您可以根据需要提供web.config条目(或文件)来实现相同目的。

编辑:删除了一个令人困惑的句子:)

答案 2 :(得分:25)

我用这个

<staticContent>
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="500.00:00:00" />
</staticContent>

使用公共缓存控制标头缓存静态内容500天。

答案 3 :(得分:19)

F5 Refresh具有“请重新加载当前HTML AND 其直接依赖性”的语义。因此,您应该期望看到HTML直接引用的任何imgs,css和js资源也被重新获取。当然304是对此的可接受的响应,但F5刷新意味着浏览器将发出请求而不是依赖新的缓存内容。

而是尝试在其他地方导航,然后导航回来。

您可以在大多数浏览器中按f5的同时按住Ctrl键强制刷新,超过304。

答案 4 :(得分:18)

  

当我的编辑被回滚时,补充了Elmer的答案。

要使用公共缓存控制标头将静态内容缓存365天,可以使用以下配置IIS

<staticContent>
    <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>

这将转换为如下标题:

Cache-Control: public,max-age=31536000

请注意,max-age是以秒为单位的增量,由RFC 2616 Sections 14.9.3 and 14.9.4中所述的正32位整数表示。这代表最大值2 ^ 31或2,147,483,648秒(超过68年)。但是,为了更好地确保客户端和服务器之间的兼容性,我们建议最多使用365天(一年)。

正如其他答案所述,您也可以在网站的web.config上使用这些指令来获取所有静态内容。作为替代方案,您只能将其用于特定位置的内容(在示例中,“cdn”文件夹中的内容为30天公共缓存):

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>

答案 5 :(得分:-1)

有一个简单的方法: 1.使用网站的web.config 2.在&#34; staticContent&#34; section删除特定的fileExtension并添加mimeMap 3.添加&#34; clientCache&#34;

<configuration>
  <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <staticContent>
      <remove fileExtension=".ipa" />
      <remove fileExtension=".apk" />
      <mimeMap fileExtension=".ipa" mimeType="application/iphone" />
      <mimeMap fileExtension=".apk" mimeType="application/vnd.android.package-archive" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="777.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>