【问题标题】:Browser cache for static contents静态内容的浏览器缓存
【发布时间】:2016-09-06 04:56:53
【问题描述】:

我正在尝试更新影响静态资源(js、css、图像)的浏览器缓存设置的配置。

我在 CMS 中上传了 Sitecore CMS 站点和图像,这些图像缓存在浏览器中(状态代码 = 200(来自缓存),当我在 Chrome 浏览器中观察网络时),但我的其他资源(如 js 和 css)提供来自Website文件夹的没有缓存在浏览器中,状态码是304(这是服务器缓存,需要往返来检查任何更新。)

我在 web.config 文件中有以下配置设置:


    <caching>
        <profiles>
            <add extension=".jpeg" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
            <add extension=".js" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
            <add extension=".png" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
            <add extension=".jpg" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
            <add extension=".css" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
            <add extension=".json" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" duration="00:00:30" />
        </profiles>
    </caching>
    <staticContent>
        <remove fileExtension=".woff2" />
        <mimeMap fileExtension=".json" mimeType="application/json" />
        <mimeMap fileExtension=".woff2" mimeType="application/x-font-woff2" />
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
    </staticContent>

现在,如果我删除缓存配置文件条目,则资源将缓存在浏览器中,我可以看到所有 css、js 状态代码为 200(来自缓存),用于后续请求。

我的问题是,这里有什么区别,为什么即使添加了 staticContent 设置,浏览器缓存也不起作用。如果我删除现有的 caching-profiles 设置会有什么影响(会影响服务器缓存吗?)。

我看到了其他一些 links,它解释了静态缓存设置,但我想知道我所做的更改的影响(删除了缓存配置文件)

请告诉我您的意见。

以下是响应标头详细信息: 使用缓存配置文件

没有缓存配置文件

谢谢, 沙拉特

【问题讨论】:

  • 您的浏览器应该遵循每个资源的Cache-Control 响应 HTTP 标头。您应该检查在浏览器中看到的 HTTP 响应中此标头的值是什么。在我看来&lt;caching&gt; 可能会覆盖您的客户端缓存的&lt;staticContent&gt; 设置,并且检查响应标头(而不是请求标头)中的Cache-Control HTTP 标头应该可以证明这一点。
  • 感谢 Frederic 的输入,我通过添加标题响应更新了问题。使用缓存配置文件,标头响应显示无缓存,当我删除缓存配置文件时,它能够缓存。正如你所说的缓存可能会覆盖静态内容,但没有找到原因,也在检查影响。

标签: asp.net-mvc web-config sitecore iis-7.5 sitecore7.2


【解决方案1】:

因此,您似乎在 web.config system.webServer/caching 节点内为 .jpeg.js、...配置 IIS output cache(请注意,.webServer,而不是 .web)。

不幸的是,IIS 输出缓存(顺便说一下,Asp.Net output cache)也处理客户端缓存,因此它(严重)干扰了您的客户端缓存设置。 (在我看来这应该是两个不同的事情,但这不是 IIS/Asp.Net 输出缓存处理它的方式。)

您的个人资料没有设置location attribute,因此它们默认为Server。使用输出缓存语义,这意味着“没有客户端缓存”,因此它在Cache-Control 响应头中添加了no-cache

为避免这种情况,您可以将您的个人资料 location 更改为 Any

<profiles>
  <add extension=".jpeg" location="Any" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
  <add extension=".js" location="Any" policy="CacheUntilChange" kernelCachePolicy="DontCache"  />
  <add extension=".png" location="Any" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
  <add extension=".jpg" location="Any" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
  <add extension=".css" location="Any" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
  <add extension=".json" location="Any" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" duration="00:00:30" />
</profiles>

但也许您不应该将 IIS 输出缓存用于 .jpeg.js、...
来自official IIS documentation

静态文件不需要输出缓存,例如 HTML、JPG 或 GIF 文件,...

对静态文件使用 IIS 输出缓存没有任何好处。 (在 IIS 前使用 varnish 等实际缓存服务器可能有好处,但使用 IIS 输出缓存模拟缓存服务器对静态文件没有好处。)

如果您有一些特殊情况 URI 以静态文件扩展名结尾,但实际上由您的应用程序动态提供,而不是直接对应于磁盘上的文件(特殊情况通常涉及使用 rammfar,这对应用程序可扩展性不利;链接顺便说一下,页面提供了一些替代项),最好尝试只为那些 URI 启用输出缓存,方法是在

下进行配置
<configuration>
  ...
  <system.webServer>
    ... <!-- not here! -->
  </system.webServer>
  ...
  <location path="yourDynamicImagesUriBasePath">
    <system.webServer>
      <caching>
        ... <!-- move it here -->

(我不确定它是否有效,当然最好测试它。)

【讨论】: