IIS7缓存控制

101
我想做一件我认为非常简单的事情。让IIS 7告诉客户端他们可以在我的网站上缓存所有图像,缓存时间为24小时。 我已经尝试了http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx 上的步骤,但并没有成功。我仍然会得到发往服务器的请求,服务器会返回304。有人知道如何实现这个功能吗?我的网站图片很多,每次请求页面时都会对用户和服务器造成压力。奇怪的是,在Firebug中,某些图片显示为“Cache-Control private,max-age = 3600”,但当我按F5时,浏览器仍然会请求它们。
6个回答

132
如果您想设置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"

5
静态内容配置元素的MSDN文档可以在此处找到:http://msdn.microsoft.com/en-us/library/ms689443.aspx - Milan Gardian
4
请查看下面的360Airwalk帖子,IIS7中有相应的用户界面。 - ChadT
仅供参考:这个设置似乎对VS 2010 SP1内置的开发服务器没有影响。如果不确定为什么不起作用,请检查IIS。 - user151323
7
嗨,Jeff,你知道如何为不同的mime类型或文件扩展名提供不同的Cache-Controlmax-age)头吗? - Jasper
@Jeff Atwood 或许你能帮我。看看这个:https://stackoverflow.com/questions/57990579/how-long-does-it-take-for-the-script-caching-to-work - moses toh

118

杰夫,那不是真的。

您只需在IIS 7管理器UI中选择一个文件夹(例如Images或甚至是默认Web应用程序文件夹),然后单击“HTTP响应标头”。然后,您必须在右窗格中单击“设置常见标头..”,并选择“过期Web内容”。在那里,您可以通过选择“After:”,在文本框中输入“24”,并在组合框中选择“小时”轻松配置最长有效期为24小时。

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

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

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


1
这个设置的用户界面太糟糕了。但是感谢你解释如何到达那里!+1 - Billy Coover
这个接口创建了一个与Jeff发布的相同配置的web.config。好知道!谢谢! - RandyMorris
2
感谢@360Airwalk的帖子。您是否知道如何为不同的MIME类型或文件扩展名提供不同的“Cache-Control”(“max-age”)头? - Jasper
3
@Jasper:例如,您可以针对每个文件夹设置它。如果您在文件夹上设置缓存控制,子文件夹将继承该设置,但您可以再次覆盖它,依此类推。甚至可以按每个文件单独设置。如果您无法访问IIS控制台,也可以通过web.config进行设置。请参阅此帖子以了解后者:https://dev59.com/OHI95IYBdhLWcg3wsQL9 - 360Airwalk

29

我使用这个

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

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


10
建议的做法是一年,基本上是365天,不要超过。 - Anicho
5
500天是糟糕的,这篇文章讲述了一个RFC规则,告诉我们不要将缓存设置为超过1年。不要将缓存设置到未来超过一年,因为这违反了RFC准则。 - foxontherock
@foxontherock,你能证实RFC规则中超过365天的不良实践吗?我在文档中找不到任何建议。 - Paesano2000
@Elmer 也许你能帮我。看看这个链接:https://stackoverflow.com/questions/57990579/how-long-does-it-take-for-the-script-caching-to-work - moses toh

21

补充Elmer的答案,因为我的编辑被回滚了。

要使用公共缓存控制头缓存静态内容365天,在IIS中可以进行以下配置:

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

这将转换为这样的标题:

Cache-Control: public,max-age=31536000

请注意,max-age是以秒为单位的增量,由正32位整数表示,如RFC 2616第14.9.3和14.9.4节所述。 这代表了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>

Luciano, 我正在尝试使用您的方法缓存我的图像。现在,当我使用HttpFox进行分析时,我发现每个图像都会发出2个请求。
  1. 第一个请求会因(NS_BINDING_ABORTED)错误而中止。
  2. 第二个请求是缓存的图像。
有什么想法吗?
- Mithil

19

F5刷新的语义是“请重新加载当前HTML和其直接依赖项”。因此,您应该期望任何由HTML直接引用的图像、CSS和JS资源也将被重新获取。当然,304响应是可以接受的,但F5刷新意味着浏览器将发出请求,而不是依赖于新鲜缓存内容。

相反,尝试简单地导航到其他地方,然后再返回。

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


1

有一个简单的方法: 1. 使用网站的web.config文件 2. 在“staticContent”部分中删除特定的fileExtension并添加mimeMap 3. 添加“clientCache”

<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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接