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


83

パー高性能ウェブサイトのYahooのベストプラクティス、私は手動ですべての私のキャッシュを管理し、Etagsとを必要としない...としています(私のヘッダからEtagsをを削除したいとき/私はファームにスケールする必要がある場合は、私は本当に彼らがいなくなって欲しいです)。Windows Server 2008でIIS7を実行しています。これを行う方法を知っている人はいますか?


この記事の第二の答えに示すように、それは以降、少なくともIIS 8.0のために働く:stackoverflow.com/questions/7947420/...
RBT

回答:


39

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

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

IIS7では実際にETagヘッダーを抑制できないため、それをまったくいじらないことがおそらく最善でしょう。最も便利な構成ルールは、「デフォルトで何かが壊れない場合は、そのままにしておく」というものです。


2
私は別の理由でetagを殺したくなります:私が物事を誤解していない限り、ファイルがないにもかかわらず、単一のサーバー上のIISがetagの最初のコンポーネント(つまり、いわゆる「Filetimestamp」)を無償で変更しているのを見ています変更されました。たとえば、ファイルの最新バージョンがブラウザに表示され、ブラウザは「If-None-Match: "01cc3a8acccc1:0"」/「If-Modified-Since:Fri、06 Jan 2012 00:32:」を送信します。 24 GMT '、およびIISは' ETag: "b6baeea8acccc1:0" '/' Last-Modified:Fri、06 Jan 2012 00:32:24GMT 'で応答します。これらは、foo.js?rev = xxxのようなURLを含むjsファイルであり、毎回同じxxxを渡します。
クリス

@Chris:私はほぼ同じことをします。jsファイルをキャッシュし、ファイルが変更されたときにのみxxxを変更することを許可します。IISのどのバージョンでも見られる動作に遭遇したことがあるとは言えません。私が疑うIIS構成に何か奇妙なことがあります。
AnthonyWJones 2012年

ありがとう。ご存知のように、etagの「Filetimestamp」部分は、要求されているファイルのタイムスタンプのみに基づいており、マシン/プロセス/アプリケーションの状態に関するものには基づいていませんか?
クリス

@Chris:私の知る限り、E-Tagはファイル時間のみに基づいています。サーバーをいじってみましたが、発生している問題を再現できません。
AnthonyWJones 2012年

サーバーを変更不可能にすることが賢明な方針であることを私は知りません。その上。私は遠い将来の有効期限をテストしていますが、HTTP304応答は必要ありません。それらのアセットはめったに変更されないことを知っているので、私は物事を長い間キャッシュに残したいと思っています。これを説明するHTTP仕様RFC2616を含むIETFドキュメントはたくさんあります。サイト管理者は自分の状況をはるかによく知っているので、サイト管理者として実行する必要があります。実装者は常に「野生」で起こっていることを探しています。
Josh Robinson

33

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を強制終了するための作業を試みることも考えることもできません。


2
このジェフは確認していませんが、httpProtocolセクションがWebサイトレベルでロックされていることが原因である可能性があります。これは、web.configファイルを介してプログラムでiis7圧縮レベルを設定しようとしたときに発生しました。最終的に、ルートサーバーレベルでそのセクションのロック解除する必要がありました。たぶん、このセクションにも同じ問題がありますか?(すべてのIIS設定がGUIを介して利用できることを本当に望んでいます)
Pure.Krome 2009

1
@ Pure.Krome:ロック解除と上記のJeffの2回目の試行を組み合わせると、ほとんどの場合、画像コンテンツを除いて(もちろん!)うまくいくようです。:-\ <sectionGroup name = "system.webServer"> <section name = "httpProtocol" overrideModeDefault = "Allow" /> </ sectionGroup> [...] <httpProtocol> <customHeaders> <clear /> <add name = "ETag" value = "" /> </ customHeaders> </ httpProtocol>したがって、少なくともここには部分的な解決策があるようです。
jerhewet 2011

@jerあなたはそれを適切な答えとして追加する必要があります
Jeff Atwood

1
@jerhewetが機能しません(Windows Server 2008 R2、IIS 7.5)
sinelaw 2013年

1
他のすべてのソリューションが失敗したか、実装できなかった場合は、単純な書き換えルールが機能しました。私の答えを参照してください:stackoverflow.com/a/18025228/705198
AndrewPK 2013

22

これを処理するためにカスタム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>

1
+1、ただしこれはWebサイトに要求されたリソースのみをカバーし、ファビコンなどはカバーしていないようです
Brad

13

これは古い質問だと思いますが、解決策を探しているときに出くわしました。この質問に対して投稿した妥当な回答を見つけたと思います。


キャッシュを変更した後にキャッシュをクリアする限り、動作することが確認されています;)
peter3 2011

7

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


6

更新:ユーザー@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を設定したりすることはできません-少なくとも私が試したすべての場合において。単純なアウトバウンドリライトルールはそうします。


1
このソリューションでは、このカスタムモジュールをIISにインストールする必要がありますが、正しいですか?
CBarr 2014

@ChrisBarrはい、そうです-申し訳ありませんが、私はそれについて言及しませんでした。回答が更新されました。
AndrewPK 2014

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:ETagを使用するかどうか


2

http://www.jesscoburn.com/archives/2008/10/02/quickly-configure-or-disable-etags-in-iis7-or-iis6/は、すばらしい画像ガイドがあります。

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


IIS6では、これは、2つの二重引用符だけでなく、値を設定しない場合にのみ機能しました。つまり、<httpProtocol> <customHeaders> <add name = "ETag" value = "" /> </ customHeaders> </ httpProtocol>
Duncan

2

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
これには、HeliconApeと呼ばれるサードパーティのプラグインが必要です。本当に必要なのは、追加のプラグインではなく、ネイティブIIS構成を使用するソリューションです。これは、ETagが最大の問題である大規模なWebファームに特に当てはまります。
キース


1

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

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

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


7
有効期限がはるかに前の場合、ブラウザは指定された日付まで(またはもちろんファイル名が変更されるまで)ファイルを文字通り再度要求することはないため、ETagは無関係になります。したがって、ファイルを削除する必要があります。このシナリオでは廃止されます。
ジェフアトウッド

3
@JeffAtwoodは厳密には当てはまりません。ユーザーが更新ボタンを押すと、ブラウザはファイルを要求します。etagが同じ場合、diffが200を取得すると、304を取得します。ここでの問題は、2つのヘッダーを送信することです。十分でした
Sam Saffron 2012年

1

私はこれがうまくいくと思います..私は削除と空白が機能しないことを知っています。

    <configuration>
     <system.webServer>
       <httpProtocol>
          <customHeaders>
            <add name="ETag" value=" " /> 
          </customHeaders>
        </httpProtocol>
       </configuration>
     </system.webServer>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.