IIS7缓存控制


95

我正在尝试做一些我认为非常简单的事情。获取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键时浏览器仍在请求它们。

Answers:


124

不幸的是,如果要设置Cache-Control标头,则IIS7 UI中没有任何东西可以做到这一点。

但是,您可以将此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天。

您也可以通过通过编辑IIS7配置数据库来做到这一点appcmd.exe,如下所示:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  设置配置“默认网站/文件夹” 
  -section:system.webServer / staticContent 
  -clientCache.cacheControlMode:UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  设置配置“默认网站/文件夹” 
  -section:system.webServer / staticContent 
  -clientCache.cacheControlMaxAge:“ 7.00:00:00”

5
可在此处找到staticContent配置元素的MSDN文档:msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian

4
请参阅下面的360Airwalk帖子,IIS7中有针对此的UI
ChadT 2010年

就像一个信息一样:此设置似乎对内置的Development Server(至少是VS 2010 SP1)没有影响。如果不确定为什么它不起作用,请与IIS联系。

6
Jeff,您好,您知道如何为不同的mime类型或文件扩展名提供不同的Cache-Controlmax-age)标头吗?
Jasper

@Jeff Atwood也许您可以帮助我。看看这个:stackoverflow.com/questions/57990579/...
成功男人

115

杰夫,那不是真的。

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

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

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

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


1
此设置的UI很糟糕。但是感谢您解释如何到达那里!+1
比利·库弗

该接口创建一个具有与Jeff发布相同配置的web.config。很高兴知道!谢谢!
RandyMorris

2
感谢您的帖子@ 360Airwalk。您是否知道如何为不同的mime类型或文件扩展名提供不同的Cache-Controlmax-age)标头?
Jasper

3
@Jasper:例如,您可以为每个文件夹设置它。如果在文件夹上设置了缓存控件,则子文件夹将继承该设置,但可以再次覆盖它,依此类推。您甚至可以基于每个文件进行操作。如果您无法访问iis控制台,则也可以通过web.config进行操作。看到这个帖子,后者stackoverflow.com/questions/2195266/...
360Airwalk

27

我用这个

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

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


10
建议的做法是1年,基本上不超过365天。
Anicho 2012年

5
500天是错误的,该文章讨论了一个RFC规则,该规则告诉您不要将缓存设置为超过一年的开发者。google.com/ speed / docs / best-practices / caching 请勿将其设置为超过一年,因为这违反了RFC准则。
foxont​​herock 2013年

@foxont​​herock是否可以证实超过365天的RFC规则是不好的做法?我在文档中找不到建议的任何内容……
Paesano2000 '18

@Elmer也许您可以帮助我。看看这个:stackoverflow.com/questions/57990579/...
成功男人

19

该F5刷新了语义的“请重新加载当前HTML 其直接依赖关系”。因此,您应该期望看到HTML也直接引用了直接引用的任何img,css和js资源。当然,304是对此的可接受的响应,但是F5刷新表示浏览器将发出请求,而不是依赖于新的缓存内容。

而是尝试简单地导航到其他地方,然后再导航回去。

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


18

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

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

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

这将转换为这样的标题:

Cache-Control: public,max-age=31536000

请注意,max-age是以秒为单位的增量,由RFC 2616第14.9.3节和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>

Luciano,我正在尝试使用您的方法来缓存我的图像。现在,当我使用HttpFox进行分析时,我看到每个图像有2个请求。1.第一个给出异常中止的结果,并显示(NS_BINDING_ABORTED)错误2.第二个请求是缓存的图像。有什么想法吗?
秘银

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.