根据雅虎高性能网站的最佳实践,我想从我的标题中删除 Etags(我手动管理所有缓存并且不需要 Etags ......以及何时/如果我需要扩展到农场,我真的很希望他们离开)。我在 Windows Server 2008 上运行 IIS7。有人知道我该怎么做吗?
12 回答
在 IIS7 下,Etag 更改编号(Etag 后面的部分 : )始终设置为 0。
因此,来自服务器的 Etag 不再因同一文件的服务器而异,因此 Yahoo 最佳实践不再真正适用。
由于您实际上无法抑制 IIS7 上的 ETag 标头,因此最好不要摆弄它。到目前为止,我发现最有用的配置规则是“如果默认设置没有破坏某些内容,请不要理会它”。
您会认为在 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 的工作,至少无需编写自定义模块等。
我编写了一个自定义 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>
我意识到这是一个老问题,但我在寻找解决方案时遇到了它。我想我找到了我为这个问题发布的合理答案。
我们遇到了这个问题,甚至在 IIS 7 中设置一个空白的自定义 ETag 标头也不适用于所有文件(例如图像文件)。我们最终创建了一个明确删除 ETag 标头的 HttpModule。
更新:感谢用户 @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>
这实际上有效,您不需要自定义 http 模块 (dll)。解锁 system.webServer 配置部分和设置 customHeaders 等不起作用 - 至少在我尝试的所有情况下。一个简单的出站重写规则就可以了。
顺便说一句,当您使用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>
我使用了removeetag.dll
在http://www.caspianit.co.uk/iis7-etag-problem/上找到的 ,它工作得很好。
希望它也对你有用
http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/有一个很好的图片指南。
本质上,您创建了一个名为 ETag 的自定义响应标头并将其值设为空。
查看这篇关于如何在 iis6、iis7 和 iis7.5 中完全删除 Etag http 标头的博客文章
我认为这会起作用..我知道删除和空白不起作用。
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="ETag" value=" " />
</customHeaders>
</httpProtocol>
</configuration>
</system.webServer>
In IIS 7 you shouldn't have to worry about etags anymore as the IIS configuration number is always set to 0.
There is still a problem if you have IIS6 & IIS7 webservers in the same farm. In this case you would have to manually set the IIS6 config number to 0 as described in this article.
Etags are actually very useful as you don't need to change the filename like stack overflow does (i.e. default.css?1234). If you change the default.css file it will change the etag and therefore subsequent requests will get the file from the server and not the cache.