如何从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="""" /> </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
实质上,您创build一个名为ETag的自定义响应头,并将其值设为空。
看看这个博客文章,如何完全删除iis6,iis7和iis7.5中的Etag http头
我使用了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>