パー高性能ウェブサイトのYahooのベストプラクティス、私は手動ですべての私のキャッシュを管理し、Etagsとを必要としない...としています(私のヘッダからEtagsをを削除したいとき/私はファームにスケールする必要がある場合は、私は本当に彼らがいなくなって欲しいです)。Windows Server 2008でIIS7を実行しています。これを行う方法を知っている人はいますか?
パー高性能ウェブサイトのYahooのベストプラクティス、私は手動ですべての私のキャッシュを管理し、Etagsとを必要としない...としています(私のヘッダからEtagsをを削除したいとき/私はファームにスケールする必要がある場合は、私は本当に彼らがいなくなって欲しいです)。Windows Server 2008でIIS7を実行しています。これを行う方法を知っている人はいますか?
回答:
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書き換えモジュールをインストールして、次のようにアウトバウンドリライトルールを追加できることがわかりました。
<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ヘッダーを完全に削除する方法については、このブログ投稿をご覧ください。
http://www.caspianit.co.uk/iis7-etag-problem/にあるものを使用しremoveetag.dll
ました 完全に機能しました。
それがあなたにもうまくいくことを願っています
IIS 7では、IIS構成番号が常に0に設定されているため、etagについて心配する必要はありません。
同じファームに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>