【问题标题】:IIS7 Cache-ControlIIS7 缓存控制
【发布时间】:2010-10-13 04:17:53
【问题描述】:

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

【问题讨论】:

    标签: asp.net iis caching iis-7


    【解决方案1】:

    如果您想设置 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 天。

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

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

    【讨论】:

    • 静态内容配置元素的 MSDN 文档可以在这里找到:msdn.microsoft.com/en-us/library/ms689443.aspx
    • 见下面的 360Airwalk 帖子,在 IIS7 中有这方面的 UI
    • 作为一个信息:此设置似乎对内置开发服务器(至少 VS 2010 SP1)没有影响。如果不确定为什么它不起作用,请检查 IIS。
    • 嗨,Jeff,您知道如何为不同的 mime 类型或文件扩展名提供不同的 Cache-Control (max-age) 标头吗?
    • @Jeff Atwood 也许你可以帮助我。看看这个:stackoverflow.com/questions/57990579/…
    【解决方案2】:

    杰夫不是这样。

    您只需在 IIS 7 管理器 UI 中选择一个文件夹(例如,图像或事件默认 Web 应用程序文件夹),然后单击“HTTP 响应标头”。然后你必须点击右窗格中的“Set Common Header..”并选择“Expire Web content”。在那里,您可以通过选择“After:”,在文本框中输入“24”并在组合框中选择“Hours”轻松配置最长 24 小时。

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

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

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

    【讨论】:

    • 这个设置的 UI 很糟糕。但感谢您解释如何到达那里! +1
    • 这个界面创建了一个与 Jeff 发布的配置相同的 web.config。很高兴知道!谢谢!
    • 感谢@360Airwalk 的帖子。您是否知道如何为不同的 mime 类型或文件扩展名提供不同的 Cache-Control (max-age) 标头?
    • @Jasper:例如,您可以为每个文件夹设置它。如果您在文件夹上设置缓存控制,子文件夹将继承该设置,但您可以再次覆盖它,依此类推。您甚至可以在每个文件的基础上进行。如果您无法访问 iis 控制台,您也可以通过 web.config 进行操作。后者见这篇帖子stackoverflow.com/questions/2195266/…
    【解决方案3】:

    我用这个

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

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

    【讨论】:

    • 推荐的做法是 1 年,基本上不再是 365 天。
    • 500 天不好,那篇文章谈到了一条 RFC 规则,告诉不要将缓存设置为超过 1 年 developers.google.com/speed/docs/best-practices/caching 不要将其设置为未来超过一年,因为这违反了RFC 指南。
    • @foxont​​herock 您可以通过什么方式来证实 365 天以上的 RFC 规则是不好的做法?我在文档中找不到任何建议...
    • @Elmer 也许你可以帮助我。看看这个:stackoverflow.com/questions/57990579/…
    【解决方案4】:

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

    【讨论】:

    • Luciano,我正在尝试使用您的方法缓存我的图像。现在,当我使用 HttpFox 进行分析时,我看到每个图像都有 2 个请求。 1. 第一个给出了一个中止的结果,出现 (NS_BINDING_ABORTED) 错误 2. 第二个请求是一个缓存的图像。有什么想法吗?
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

      有一个简单的方法: 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2012-06-06
        • 2010-11-25
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多