如何从IIS7中删除电子标签头?

根据雅虎的高性能网站的最佳实践 ,我想从我的头文件中删除Etags(我手动pipe理我所有的caching,并且不需要Etags,当需要扩展到农场时,我真的很喜欢他们走了)。 我在Windows Server 2008上运行IIS7。任何人都知道我可以做到这一点?

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

因此,对于同一个文件,服务器的Etag不再因服务器而异,因此雅虎的最佳实践不再适用。

既然你实际上不能压制IIS7上的ETag头文件,那么最好不要瞎搞。 到目前为止,我发现最有用的configuration规则是“如果默认设置没有被破坏,就把它放在一边”。

你会认为在web.config中这样做会在IIS7中禁用ETags。 但嗅探器的踪迹证实,无论如何,ETag被发送。

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

使用空白也不起作用。 无论如何,ETag都会被发送。

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

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

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

导致更多的 ETag被发送:

 ETag:“8ee1ce1acf18ca1:0”,“”

总之,没有什么我可以尝试或想到在IIS7上杀死ETag的东西,至less不用编写自定义模块等。

我写了一个自定义的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> 

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

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

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

在iis 6中很容易,你可以为'ETag'=“”添加一个自定义头

在IIS 7中,在阅读了这个线程之后,发现不使用自定义http模块是不可能的,我发现你可以简单地安装微软的URL Rewrite模块,并添加一个出站重写规则,如下所示:

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

这实际上工作,并且你不需要一个自定义http模块(dll)。 解锁system.webServerconfiguration部分并设置customHeaders等不起作用 – 至less在所有我尝试的情况下。 一个简单的出站重写规则。

顺便说一句,当你使用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:使用或不使用ETag

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

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

看看这个博客文章,如何完全删除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/

我使用了http://www.caspianit.co.uk/iis7-etag-problem/上的;removeetag.dll ,它工作的很完美。

希望它也能为你效劳

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

如果在同一场中有IIS6和IIS7 Web服务器,则仍然存在问题。 在这种情况下,您将不得不按照本文所述手动将IIS6configuration编号设置为0。

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

我认为这将工作..我知道删除和空白不起作用。

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