IIS7キャッシュ制御


95

私はかなり簡単だと思った何かをしようとしています。IIS 7を入手して、私のサイト上のすべての画像を一定時間(たとえば24時間)キャッシュできることをクライアントに伝えます。

私はhttp://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspxでステップを試しましたが、役に立ちませんでした。304sが返されたままサーバーにリクエストが送信されます。

誰かがこれを行う方法を持っていますか?グラフィックを多用するサイトがあり、ユーザーがページをリクエストするたびにユーザー(サーバーも同様)が攻撃されています。ひどく、画像は "Cache-Control private、max-age = 3600"がFirebugに表示されているように見えますが、F5を押してもブラウザーは画像を要求しています。

回答:


124

残念ながら、Cache-Controlヘッダーを設定したい場合、IIS7 UIにはこれを行うものはありません。

ただし、このweb.configを、設定するフォルダーまたはサイトのルートにドロップできます。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

これにより、そのフォルダーとすべてのサブフォルダーに7日間コンテンツをキャッシュするようにクライアントに通知します。

次のappcmd.exeように、IIS7メタベースをで編集してこれを行うこともできます。

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  設定 "Default Web Site / folder" 
  -section:system.webServer / staticContent 
  -clientCache.cacheControlMode:UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  設定 "Default Web Site / folder" 
  -section:system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00:00:00"

5
staticContent構成要素に関するMSDNドキュメントは、msdn.microsoft.com
us

4
以下の360Airwalkの投稿を参照してください。IIS7にはこのUIがあります
ChadT 2010

情報として:この設定は、(少なくともVS 2010 SP1の)組み込みの開発サーバーには影響を与えないようです。それが機能しない理由がわからない場合は、IISで確認してください。

6
こんにちはジェフ、異なるMIMEタイプまたはファイル拡張子に対して異なるCache-Controlmax-age)ヘッダーを提供する方法を知っていますか?
Jasper

@ジェフアトウッド多分あなたは私を助けることができます。これを見てください。stackoverflow.com
Success Man

115

それは本当のジェフではありません。

IIS 7マネージャーUI内のフォルダー(例:画像またはイベントの既定のWebアプリケーションフォルダー)を選択し、[HTTP応答ヘッダー]をクリックするだけです。次に、右側のペインの「Set Common Header ..」をクリックして、「Expire Web content」を選択する必要があります。そこで、「後:」を選択し、テキストボックスに「24」と入力して、コンボボックスで「時間」を選択することで、最大24時間の年齢を簡単に構成できます。

web.configエントリに関する最初の段落は正しいです。cacheControlCustom-attributeを追加して、キャッシュコントロールヘッダーを "public"またはその場合に必要なものに設定します。

もちろん、必要に応じてweb.configエントリ(またはファイル)を提供することで同じことを実現できます。

編集:紛らわしい文章を削除しました:)


1
この設定のUIはひどいです。しかし、そこに着く方法を説明してくれてありがとう!+1
ビリークーバー

このインターフェースは、Jeffが投稿したのと同じ設定でweb.configを作成します。知っておくといい!ありがとう!
RandyMorris 2011

2
@ 360Airwalkの投稿ありがとうございます。異なるMIMEタイプまたはファイル拡張子に対して異なるCache-Controlmax-age)ヘッダーを提供する方法を知っていますか?
Jasper

3
@Jasper:たとえば、フォルダーごとに設定できます。フォルダーにキャッシュ制御を設定すると、サブフォルダーは設定を継承しますが、再度オーバーライドすることができます。ファイルごとに行うこともできます。iisコンソールにアクセスできない場合は、web.configからもアクセスできます。後者のstackoverflow.com/questions/2195266/…
360Airwalk 2012

27

私はこれを使います

<staticContent>
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="500.00:00:00" />
</staticContent>

パブリックキャッシュコントロールヘッダーを使用して静的コンテンツを500日間キャッシュします。


10
推奨されるプラクティスは、1年、基本的には365日です。
アニチョ

5
500日以上1年にキャッシュを設定しないように言っRFCルールに関する記事の交渉があること、BADである developers.google.com/speed/docs/best-practices/caching DOは、将来的に一年以上に設定していません、これはRFCガイドラインに違反しているためです。
foxont​​herock 2013年

@foxont​​herock 365日を超えるRFCルールを悪用する方法はありますか?ドキュメントでこれを示唆するものを見つけることができません...
Paesano2000 '13

@エルマー多分あなたは私を助けることができます。これを見てください。stackoverflow.com
Success Man

19

F5リフレッシュは、「現在のHTML その直接の依存関係を再読み込みしてください」という意味を持っています 。したがって、HTMLによって直接参照されるimgs、css、jsリソースも再フェッチされることを期待する必要があります。もちろん304はこれに対する許容可能な応答ですが、F5リフレッシュは、ブラウザーが新しいキャッシュコンテンツに依存するのではなく、要求を行うことを意味します。

代わりに、単にどこか別の場所に移動してから、戻ってみてください。

ほとんどのブラウザでCtrlキーを押しながらF5キーを押すと、304を過ぎて強制的に更新できます。


18

編集がロールバックされたため、Elmerの回答を補足します。

パブリックキャッシュコントロールヘッダーを使用して静的コンテンツを365日間キャッシュするには、IISを次のように構成できます。

<staticContent>
    <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>

これは、次のようなヘッダーに変換されます。

Cache-Control: public,max-age=31536000

max-ageは秒単位のデルタであり、RFC 2616セクション14.9.3および14.9.4に記載されているように、正の32ビット整数で表されることに注意してください。これは、2 ^ 31または2,147,483,648秒(68年以上)の最大値を表します。ただし、クライアントとサーバー間の互換性をより確実にするために、推奨される最大365日(1年)を採用しています。

他の回答で述べたように、すべての静的コンテンツに対して、サイトのweb.configでもこれらのディレクティブを使用できます。別の方法として、特定の場所のコンテンツにものみ使用できます(サンプルでは、​​「cdn」フォルダー内のコンテンツの30日間のパブリックキャッシュ)。

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>

ルチアーノ、私はあなたの方法で画像をキャッシュしようとしています。HttpFoxを使用して分析すると、各画像に対して2つの要求が行われたことがわかります。1.最初のリクエストは(NS_BINDING_ABORTED)エラーで中止された結果を返します。2. 2番目のリクエストはキャッシュされた画像です。何かご意見は?
ミジル2013年

1

簡単な方法があります:1.ウェブサイトのweb.configを使用2.「staticContent」セクションで特定のfileExtensionを削除してmimeMapを追加3.「clientCache」を追加

<configuration>
  <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <staticContent>
      <remove fileExtension=".ipa" />
      <remove fileExtension=".apk" />
      <mimeMap fileExtension=".ipa" mimeType="application/iphone" />
      <mimeMap fileExtension=".apk" mimeType="application/vnd.android.package-archive" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="777.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.