如何从IIS7中删除eTag标头?

83 asp.net etag iis-7

根据雅虎针对高性能网站的最佳做法,我想从我的标题中删除Etags(我手动管理所有缓存,不需要Etags ......以及何时/如果我需要扩展到农场,我真的很喜欢他们走了).我在Windows Server 2008上运行IIS7.任何人都知道我该怎么做?

Ant*_*nes 39

在IIS7下,Etag更改编号(以下Etag的部分)始终设置为0.

因此,服务器上的Etag不再因服务器而异,因此雅虎的最佳实践不再适用.

由于你无法在IIS7上实际上压制ETag标头,所以最好不要使用它.到目前为止,我发现最有用的配置规则是"如果默认不破坏某些东西,请不要理会".

  • 我很想以不同的理由杀死etags:除非我误解了事情,否则我会在*单一服务器上看到IIS*无偿更改etags的*first*组件(即所谓的"Filetimestamp")尽管我的文件没有被修改.例如,文件的最新版本将在浏览器中,浏览器将发送'If-None-Match:"01cc3a8acccc1:0"'/'If-Modified-Since:Fri,06 Jan 2012 00:32: 24 GMT',IIS将以'ETag:'b6baeea8acccc1:0"'/'Last-Modified:Fri,06 Jan 2012 00:32:24 GMT'回应.这些是带有foo.js?rev = xxx等URL的js文件,每次传递相同的xxx. (2认同)

Jef*_*ood 33

您可能会认为在web.config中执行此操作可以在IIS7中禁用ETag.但是嗅探器跟踪证实了ETag无论如何都被发送了.

<httpProtocol>
    <customHeaders>
        <remove name="ETag" />
    </customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)

使用空白也不起作用.无论如何ETag都被送了下来.

<httpProtocol>
    <customHeaders>
        <add name="ETag" value="" />
    </customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)

将ETag设置为其他站点建议的空白引号不起作用.

<httpProtocol>
    <customHeaders>
        <add name="ETag" value="&quot;&quot;" />
    </customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)

导致更多 ETag被发送:

ETag: "8ee1ce1acf18ca1:0",""

总而言之,我无法尝试或想到的任何东西都可以杀死IIS7上的ETag,至少不需要编写自定义模块等.

  • 我没有证实这个杰夫,但这可能是因为httpProtocol部分被锁定在网站级别.当我试图通过web.config文件以编程方式设置iis7*compression*级别时,我发现了这种情况.我不得不最终解锁*根服务器级别上的那个部分.也许这一节有同样的问题?(我真的希望通过GUI提供所有IIS设置) (2认同)

Dan*_*Dan 23

我写了一个自定义的http模块来处理这个问题.它真的没那么糟糕.这是代码:

using System;
using System.Web;

namespace StrongNamespace.HttpModules
{
    public class CustomHeaderModule : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.PostReleaseRequestState += new EventHandler(application_PostReleaseRequestState);

        }

        public void Dispose()
        {
        }

        void application_PostReleaseRequestState(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Headers.Remove("Server");
            HttpContext.Current.Response.Headers.Remove("X-AspNet-Version");
            HttpContext.Current.Response.Headers.Remove("ETag");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是您想要的web.config更改:

<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <remove name="X-Powered-By"/>
            </customHeaders>
        </httpProtocol>
        <modules>
            <add name="CustomHeaderModule" type="StrongNamespace.HttpModules.CustomHeaderModule"/>
        </modules>
    </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)


Nat*_*Fox 13

我意识到这是一个老问题,但我在寻找解决方案时遇到了它.我想我找到了一个合理的答案,我发布了这个问题.


jwa*_*gel 7

我们遇到了这个问题,甚至在IIS 7中设置一个空白的自定义ETag标头也不适用于所有文件(例如图像文件).我们最终创建了一个显式删除ETag标头的HttpModule.


And*_*wPK 6

更新:感谢用户@ChrisBarr添加了URL重写模块的要求

在iis 6中很容易,您可以为'ETag'=""添加自定义标题

在IIS 7中,在阅读此线程并确定不使用自定义http模块后无法实现之后,我发现您只需安装Microsoft的URL Rewrite模块并添加出站重写规则,如下所示:

<outboundRules>
  <rule name="Remove ETag">
    <match serverVariable="RESPONSE_ETag" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>
Run Code Online (Sandbox Code Playgroud)

这实际上有效,您不需要自定义http模块(dll).解锁system.webServer配置部分和设置customHeaders等不起作用 - 至少在我尝试过的所有情况下都是如此.一个简单的出站重写规则.


Sör*_*lau 2

http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/有一个很好的图片指南。

本质上,您创建一个名为 ETag 的自定义响应标头并将其值设为空。