是否可以针对不同的静态文件类型在 IIS 中控制 Cache-Control 标头?

Cra*_*rer 5 iis-7

在 IIS 中,我可以将其配置为为同一文件夹中的不同静态文件类型返回不同的缓存控制标头吗?

我知道我可以使用 HTTP 标头功能来设置立即过期,但这似乎会影响所有内容。有没有办法为静态内容的特定文件扩展名做这件事?

Tyl*_*the 2

虽然这不是一个理想的答案,但我确实找到了解决方法。在我的应用程序中,我可以控制 JS、CSS 和其他类似文件在目录结构中的位置。我所做的是将以下行放入web.configIIS 根目录中(除其他外,不相关):

<configuration>
  <system.webServer>
     <staticContent>
       <clientCache cacheControlMode="DisableCache" setEtag="true" />
     </staticContent>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

这在 IIS 中设置了默认值,即不应缓存任何内容。这是我的单页应用程序 (SPA) 的 HTML 页面 (index.html) 所在的位置,因此这就是我想要的。

然后,在图像、JS、CSS 等的直接子目录中,我有web.config包含以下内容的文件:

<configuration>
  <system.webServer>
     <staticContent>
       <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="14.00:00:00" setEtag="true" />
     </staticContent>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

您当然可以将年龄设置为您想要的任何值。我现在开始的时间是 14 天,直到我确定一切正常,然后我可能会将其延长到几个月。

这样,我的 SPA 的 HTML 永远不会被缓存,但所有 JS/CSS/图像将按照我的意愿存活。当我为下次部署重建项目时,web-pack 将为打包的 JS 和 CSS 生成新的文件名,因此不存在缓存问题。HTML 文件当然名称相同,但包含的 JS 文件名称会不同。因此,关键是 HTML 文件永远不会被缓存,这是此设置完成的。

IIS 确实应该让这个变得更简单。按文件类型缓存的配置可以完美工作,不需要严格的目录结构管理,并非所有项目都可以灵活遵循。