web-dev-qa-db-ja.com

IIS7からeTagヘッダーを削除するにはどうすればよいですか?

高性能Webサイトに対するYahooのベストプラクティス 、ヘッダーからEtagを削除したい(すべてのキャッシュを手動で管理しており、Etagを必要としない...およびwhen/if農場にスケールする必要があります、私は本当に彼らがいなくなって欲しいです)。 Windows Server 2008でIIS7を実行しています。これを行う方法を知っている人はいますか?

82
Brent Broome

IIS7では、Etag変更番号(Etagの次の部分:)は常に0に設定されます。

したがって、サーバーからのEtagが同じファイルに対してサーバー間で異なることはなくなり、したがって、Yahooのベストプラクティスは実際には適用されなくなりました。

実際にIIS7でETagヘッダーを抑制することはできないので、おそらくそれをまったくいじらないことをお勧めします。最も有用な構成ルールは、「デフォルトで問題が発生しない場合はそのままにしておく」ことです。

39
AnthonyWJones

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="&quot;&quot;" />
    </customHeaders>
</httpProtocol>

原因さらに ETagが送信される:

 ETag: "8ee1ce1acf18ca1:0"、 "" 

結論として、少なくともカスタムモジュールなどを記述せずに、IIS7でETagを強制終了するための試みや考えられることは何もありません。

32
Jeff Atwood

これを処理するカスタム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>
23
Dan

これは古い質問であることに気づきましたが、解決策を探しているときに出くわしました。 この質問 に投稿した合理的な答えを見つけたと思います。

13
Nathan Fox

この問題が発生し、空のカスタムETagヘッダーをIIS 7に設定しても、すべてのファイル(画像ファイルなど)で機能しませんでした。ETagヘッダーを明示的に削除するHttpModuleを作成しました。 。

7
jwanagel

UPDATE:ユーザー@ChrisBarrのおかげでURL書き換えモジュールの要件が追加されました

Iis 6では簡単です。'ETag '= ""のカスタムヘッダーを追加できます

IIS 7、このスレッドを読んで、カスタムhttpモジュールを使用しないと不可能だと考えた後、私はあなたが単純にインストールできることを発見しました MicrosoftのURL書き換えモジュール と追加次のアウトバウンド書き換えルール:

<outboundRules>
  <rule name="Remove ETag">
    <match serverVariable="RESPONSE_ETag" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>

これは実際に機能し、カスタムhttpモジュール(dll)は必要ありません。 system.webServer構成セクションのロック解除とcustomHeadersなどの設定は機能しません-少なくとも私が試したすべてのケースで。シンプルなアウトバウンド書き換えルールがあります。

6
AndrewPK

ちなみに、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を使用するかどうか

4
JeffZhnn

Iis6、iis7、iis7.5でEtag httpヘッダーを完全に削除する方法については、このブログ投稿をご覧ください

http://lightspeednow.com/blog/2010/05/21/iis-tutorial-how-to-completely-remove-etags-entity-tags-from-iis6-iis7-and-iis7-5/

2
Brian

http://www.caspianit.co.uk/iis7-etag-problem/ にあるremoveetag.dllを使用しましたが、完全に機能しました。

それがあなたにとってもうまくいくことを願っています

2
Ranjith

http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/ に素敵な図解ガイドがあります。

基本的に、ETagという名前のカスタム応答ヘッダーを作成し、その値を空にします。

2
Sören Kuklau

IIS 7では、IIS構成番号は常に0に設定されているため、etagについて心配する必要はありません。

同じファームにIIS6およびIIS7 Webサーバーがある場合は、まだ問題があります。この場合、この 記事 で説明されているように、IIS6の構成番号を手動で0に設定する必要があります。

Etagは、スタックオーバーフローのようにファイル名を変更する必要がないため、実際には非常に便利です(つまり、default.css?1234)。 default.cssファイルを変更すると、etagが変更されるため、後続のリクエストはキャッシュではなくサーバーからファイルを取得します。

1
Alex

これはうまくいくと思う.. removeとblankは機能しないことを知っている。

    <configuration>
     <system.webServer>
       <httpProtocol>
          <customHeaders>
            <add name="ETag" value=" " /> 
          </customHeaders>
        </httpProtocol>
       </configuration>
     </system.webServer>
1