如何将<clientcache>设置应用于IIS中的特定扩展?

时间:2016-04-22 01:29:12

标签: azure iis web-config azure-web-sites

我在Azure上使用以下Web.config托管Web应用程序:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <mimeMap fileExtension=".text" mimeType="text/plain" />
      <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

这有效,但我想通过扩展来改变缓存时间。我想将.html文件的最大年龄设置为1天,将其他所有文件的最大年龄设置为365天。原因是html中的所有资产都有自己的文件名在更改时加速并且是从CDN提供的,因此它们永远不需要过期,但是html页面本身需要始终保持新鲜,以便用户可以看到新内容。 / p>

我看到<location>元素允许将Web.config过滤到特定位置,但我没有办法将其限制为某些扩展名。

请注意,我没有要求能够在Web.config中执行此操作:使用Azure Web App的任何可能方法都可以。

3 个答案:

答案 0 :(得分:12)

正如其他人所说,这是不可能的,所以我想建议一个解决方法来完成这项工作 您可以通过创建出站规则来替换html文件的Cache-Control标题来利用URL重写模块的功能。

这是配置。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <staticContent>
            <mimeMap fileExtension=".text" mimeType="text/plain" />
            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
        </staticContent>
        <rewrite>
            <outboundRules>
                <rule name="RewriteCacheControlForHTMLFiles" preCondition="FileEndsWithHtml">
                    <match serverVariable="RESPONSE_Cache_Control" pattern=".*" />
                    <action type="Rewrite" value="max-age=86400" />
                </rule>
                <preConditions>
                    <preCondition name="FileEndsWithHtml">
                        <add input="{REQUEST_FILENAME}" pattern="\.html$" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

我的测试截图:

enter image description here

答案 1 :(得分:3)

这些文件(html与内容)是否在不同的文件夹中? 如果是这样,您可以设置特定于文件夹的缓存时间

<configuration>
<location path="[html files path]">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="[your requirement]" ></clientCache>
      </staticContent>
    </system.webServer>
  </location>
</configuration>

答案 2 :(得分:1)

不幸的是,<location>元素不支持regexwildcards,因此您将无法完全按照自己的要求进行操作。

我可以想出几种方法来实现你的目标。第一个是write an http module拦截对图像的请求并更改缓存头。

另一个选项是保持html不变,但将所有图像移动到图像文件夹。然后,您可以在该文件夹上设置缓存规则。您可以使用重定向规则将图像请求重定向到该图像文件夹。如果您选择此路径,我可以为您提供有关如何设置它的更多信息。