如何从IIS7中删除eTag标头?

时间:2009-01-25 16:44:37

标签: asp.net iis-7 etag

Per Yahoo's best practices for high performance web sites,我想从标题中删除Etags(我手动管理所有缓存,不需要Etags ...以及何时/如果我需要扩展到一个农场,我真的很喜欢他们走了)。我在Windows Server 2008上运行IIS7。任何人都知道我该怎么做?

12 个答案:

答案 0 :(得分:39)

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

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

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

答案 1 :(得分:32)

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

<httpProtocol>
    <customHeaders>
        <remove name="ETag" />
    </customHeaders>
</httpProtocol>

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

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

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

<httpProtocol>
    <customHeaders>
        <add name="ETag" value="&quot;&quot;" />
    </customHeaders>
</httpProtocol>

导致发送更多 ETag:

ETag: "8ee1ce1acf18ca1:0",""

总之,我无法尝试或想到的任何东西都可以杀死IIS7上的ETag,至少在没有编写自定义模块的情况下等等。

答案 2 :(得分: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");
        }
    }
}

以下是您想要的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>

答案 3 :(得分:13)

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

答案 4 :(得分:7)

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

答案 5 :(得分:6)

UPDATE:由于用户@ChrisBarr

而添加了网址重写模块要求

在iis 6中很容易,您可以为'ETag'=“”

添加自定义标题

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

<outboundRules>
  <rule name="Remove ETag">
    <match serverVariable="RESPONSE_ETag" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>

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

答案 6 :(得分:4)

顺便说一下,当你使用 iis8 时,这很简单

<element name="clientCache">
   <attribute name="cacheControlMode" type="enum" defaultValue="NoControl">
          <enum name="NoControl" value="0" />
          <enum name="DisableCache" value="1" />
          <enum name="UseMaxAge" value="2" />
          <enum name="UseExpires" value="3" />
  </attribute>
  <attribute name="cacheControlMaxAge" type="timeSpan" defaultValue="1.00:00:00" />
  <attribute name="httpExpires" type="string" />
  <attribute name="cacheControlCustom" type="string" />
  <attribute name="setEtag" type="bool" defaultValue="true" />
</element>

IIS 8.0: To use or not to use ETag

<强>

答案 7 :(得分:2)

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

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

答案 8 :(得分:2)

查看此博客文章,了解如何在iis6,iis7和iis7.5中完全删除Etag http标头

http://lightspeednow.com/blog/2010/05/21/iis-tutorial-how-to-completely-remove-etags-entity-tags-from-iis6-iis7-and-iis7-5/

答案 9 :(得分:2)

我使用http://www.caspianit.co.uk/iis7-etag-problem/上找到的removeetag.dll并且效果很好。

希望它也适合你

答案 10 :(得分:1)

在IIS 7中,您不必再担心etags,因为IIS配置编号始终设置为0.

如果你有IIS6&amp; IIS7 Web服务器位于同一个服务器场中。在这种情况下,您必须手动将IIS6配置编号设置为0,如此article中所述。

Etags实际上非常有用,因为您不需要像堆栈溢出那样更改文件名(即default.css?1234)。如果更改default.css文件,它将更改etag,因此后续请求将从服务器而不是缓存中获取文件。

答案 11 :(得分:1)

我认为这样可行..我知道删除和空白不起作用。

    <configuration>
     <system.webServer>
       <httpProtocol>
          <customHeaders>
            <add name="ETag" value=" " /> 
          </customHeaders>
        </httpProtocol>
       </configuration>
     </system.webServer>