私はあなたの状況を理解しています。IIS がファイルを処理する方法がわかりにくい場合があります。また、IIS 6 と IIS 7 では異なり、クラシック アプリケーション プールと統合モード アプリケーション プールでも異なります。私の経験は主に IIS 7.5 の統合アプリケーション プールに関するものであるため、この環境について最も正確にコメントできます。
最初の質問
しかし、IIS は実際に静的コンテンツとそうでないものをどのように認識しているのでしょうか。
ASPX 、 ashx ではなく、 images 、 css 、 js だけですか?
すでに静的と見なされているものとそうでないものを IIS のどこで確認できますか?
Web サイトに移動して [ハンドラー マッピング] をクリックすると、IIS のファイル ハンドラーのリストを調べることができます。デフォルトでは、これらは .Net フレームワークのバージョンによって異なる場所にある .Net ベースの web.config から継承されます。
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config
- C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config
要求されたファイルがまだ別のハンドラーに明示的にマップされていない場合*
、最後のオプション ( ) として、System.Web.DefaultHttpHandler
それが静的ファイルまたはディレクトリ ブラウジング要求であるかどうかを判断するすべてのハンドラーをキャッチ ( ) になります。したがって、静的ファイルは、別のハンドラーにまだバインドされていない単なるファイルです。たとえば、このデフォルト ハンドラーの前に*.aspx
既にマップされていることがわかります。System.Web.UI.PageHandlerFactory
したがって、そのハンドラーによって処理され、静的ファイルとは見なされません。そのマッピングを削除すると、必要に応じて技術的に *.aspx を静的ファイルとして提供できます (それがどのように機能するかを証明するためだけに)。
System.Web.StaticFileHandler
ただし、IIS でファイル拡張子をマッピングする web.config の httpHandlers セクションにエントリを追加することにより、ファイルの種類を静的ファイルとして明示的に一覧表示することもできます。例えば:
<configuration>
<system.webServer>
<handlers>
<add name="StaticHandler" verb="*" path="*.zip" type="System.Web.StaticFileHandler" preCondition="integratedMode" />
</handlers>
</system.webServer>
</configuration>
この例では<system.webServer>
config セクションを使用しているため、統合モードで実行されているアプリケーション プール用です。
2 番目の質問
ページが <%@ OutputCache header(without location) で宣言されているシナリオはどうですか。その中の画像、css、js srcファイルも同じプロパティで出力キャッシュされていますか?
いいえ。ページは別のリクエストとして (おそらく別のハンドラーによって) サーバーに送られるため、まったく異なるキャッシュ ヘッダー/ヒントを持つことができます。ホスト ページとそれが使用する可能性のあるリソースは、キャッシュの観点からは関係ありません。
実際、*.html のキャッシュ期間を短くし、*.jpg または *.png のキャッシュ期間を長くしたい場合もあります。考慮すべきこと。
3 番目の質問
最善の方法として、最大の有効期限として 1 年先を設定する必要があります。これを、サイトのすべての静的コンテンツのデフォルトとして使用する必要があります。
うーん…1年も行かないかも。1ヶ月くらい?次のようなグローバル ポリシーを設定します。
<configuration>
<system.webServer>
<staticContent>
<!-- Set expire headers to 30 days for static content-->
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
</staticContent>
</system.webServer>
</configuration>
これは上に示したサンプルと同じですが、<location>
要素内ではなく、ルート<configuration>
要素内にあるため、デフォルト ポリシーです。繰り返しますが、これはIntegrated Modeで実行されている App Pool 用です。場合によっては、以下もオンにする必要があります。
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<!-- stuff -->
</modules>
</system.webServer>
<system.webServer>
これにより、静的ファイルが上記の構成要素を尊重する管理された静的ファイル ハンドラーを介して処理されるようになります。
編集してコメントに対処する
上記で投稿した構成ダイアログのドキュメントは、HTTP Expires 応答ヘッダーの構成 (IIS 7)にあります。
どうやらこれらの設定はC:\Windows\System32\inetsrv\config\applicationHost.configに保存されているようです
私は IIS7 を持っておらず、現在 IIS 7.5 で個人的に開発しています。この場所が正確であることを確認できる場合は、コメントを投稿してください。