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