按照Yahoo高性能网站的最佳做法,我想从标头中删除Etags(我正在手动管理所有缓存,不需要Etags ...以及何时/如果需要扩展到服务器场,我真的希望他们走了)。我在Windows Server 2008上运行IIS7。有人知道我该怎么做吗?
按照Yahoo高性能网站的最佳做法,我想从标头中删除Etags(我正在手动管理所有缓存,不需要Etags ...以及何时/如果需要扩展到服务器场,我真的希望他们走了)。我在Windows Server 2008上运行IIS7。有人知道我该怎么做吗?
Answers:
在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>
更新:由于用户@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>
http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/有一个不错的图片指南。
本质上,您将创建一个名为ETag的自定义响应标头,并将其值设置为空。
查看此博客文章,了解如何完全删除iis6,iis7和iis7.5中的Etag http标头
我用的是removeetag.dll
发现http://www.caspianit.co.uk/iis7-etag-problem/ ,它运行良好。
希望它也会对你也很好
在IIS 7中,您不必再担心etags了,因为IIS配置号始终设置为0。
如果同一服务器场中有IIS6和IIS7 Web服务器,则仍然存在问题。在这种情况下,您将必须手动将IIS6配置号设置为0,如本文所述。。
Etag实际上非常有用,因为您不需要像堆栈溢出那样更改文件名(即default.css?1234)。如果更改default.css文件,它将更改etag,因此后续请求将从服务器而不是从缓存获取文件。
我认为这会工作..我知道删除和空白行不通。
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="ETag" value=" " />
</customHeaders>
</httpProtocol>
</configuration>
</system.webServer>