按照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>