如何在 IIS 上为 text/html 页面使用 eTag

Posted

技术标签:

【中文标题】如何在 IIS 上为 text/html 页面使用 eTag【英文标题】:How to Use eTag on IIS for text/html Pages 【发布时间】:2020-03-22 00:50:57 【问题描述】:

我有一个网站,它位于非公共域上,并通过代理在不同域上交付。我们在缓存内容时遇到了一些问题 - 这是一个 Umbraco 站点,如果您直接访问域而不是通过代理,则进行更改会更新页面。

我被告知代理尊重响应标头并设置 eTag 可以解决此问题。对此进行研究后,我可以看到 IIS 默认设置了 eTag,并且我可以看到它正在处理静态内容,即 .js.css 文件,如下所示:

但是,如果我访问网站上的某个页面,例如 /uk/products/product,我看不到 eTag 标题。

这是预期的行为,它应该只使用那些静态内容文件还是我可以在页面上设置它以告诉代理它应该重新缓存?

【问题讨论】:

【参考方案1】:

ETag HTTP 响应标头是资源特定版本的标识符。它使缓存更有效并节省带宽,因为如果内容没有更改,Web 服务器不需要重新发送完整的响应。此外,etags 有助于防止资源的同时更新相互覆盖(“空中冲突”)。

如果给定 URL 的资源发生变化,则必须生成新的 Etag 值。

静态内容不会因请求而异。返回到 Web 浏览器的内容总是相同的。静态内容的示例包括 html、JPG 或 GIF 文件。

IIS 自动缓存静态内容(例如 HTML 页面、图像和样式表),因为这些类型的内容不会因请求而异。 IIS 还会在您进行更新时检测到对文件的更改,并且 IIS 会根据需要刷新缓存。

要在 iis 中启用缓存,您可以使用 iis 输出缓存功能:

1) 打开 iis 管理器。选择网站。

2) 从中间窗格中选择输出缓存功能。

3) 从中间窗格中选择编辑功能设置。

4)勾选启用缓存和启用内核缓存框并点击确定。

如果您想将 ETag 设置为空白,您也可以在 web.config 文件中添加以下代码:

<httpProtocol>
    <customHeaders>
        <add name="ETag" value="" />
    </customHeaders>
</httpProtocol>

请参阅下面的这篇文章了解更多详情:

Caching

To use or not to use ETag, that is the question.

Configure IIS Output Caching

【讨论】:

虽然您的帖子有一些很好的信息,但它没有回答主要问题:如何让 IIS 为静态 js 和 css 文件以外的内容提供 ETag 标头【参考方案2】:

我读到版本 7 之后的 IIS 会自动启用 E-tags,但是,我运行了 Pingdom 速度测试,报告建议我启用 E-tags。我不确定该报告是否准确,或者我阅读的有关 IIS 7 及更高版本的信息可能不正确。

【讨论】:

以上是关于如何在 IIS 上为 text/html 页面使用 eTag的主要内容,如果未能解决你的问题,请参考以下文章

在多个站点上为PHP配置IIS7

Facebook 如何在画布页面上为 iFrame 设置跨域 cookie?

如何在同一页面上为 2 个无线电流制作播放/停止按钮?

从 MVC / IIS Web 应用程序向子域提供服务

在 WooCommerce 单一产品页面上为特定产品添加自定义内容

如何在鼠标滚轮滚动上为剪贴蒙版设置动画