2016-04-22 7 views
6

私は、次のWeb.configファイルでのAzure上のWebアプリケーションをホスティングしています:<clientCache />設定をIISの特定の拡張にどのように適用できますか?

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
    <staticContent> 
     <mimeMap fileExtension=".text" mimeType="text/plain" /> 
     <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" /> 
    </staticContent> 
    </system.webServer> 
</configuration> 

これは動作しますが、私は拡張子によってキャッシュ年齢を変更したいと思います。 .htmlファイルの最大保存期間を1日に設定し、他のすべての最大保存期間を365日に設定したいと考えています。その理由は、htmlのすべてのアセットが変更されたときにファイル名が変更され、CDNから配信されるため、期限切れにする必要はありませんが、htmlページ自体は常に新鮮である必要があります。

要素<location>はWeb.configの特定の場所へのフィルタリングを許可していますが、特定の拡張子に制限する方法はありません。

は、Web.configでがこれを実行できることを要求していません。Azure Web Appで可能な手段はすべて問題ありません。

答えて

6

他の人も触れられていないので、私はその仕事をするための回避策を提案したいと思います。
URL書き換えモジュールの機能を活用するには、htmlファイルのCache-Controlヘッダーを置き換える送信ルールを作成します。

ここに設定があります。

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <staticContent> 
      <mimeMap fileExtension=".text" mimeType="text/plain" /> 
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" /> 
     </staticContent> 
     <rewrite> 
      <outboundRules> 
       <rule name="RewriteCacheControlForHTMLFiles" preCondition="FileEndsWithHtml"> 
        <match serverVariable="RESPONSE_Cache_Control" pattern=".*" /> 
        <action type="Rewrite" value="max-age=86400" /> 
       </rule> 
       <preConditions> 
        <preCondition name="FileEndsWithHtml"> 
         <add input="{REQUEST_FILENAME}" pattern="\.html$" /> 
        </preCondition> 
       </preConditions> 
      </outboundRules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

私のテストのスクリーンショット:

enter image description here

+0

私のコンテンツを動かすために以下に示唆された回避策も同様に機能しましたが、これははるかに簡単で作業が少なくて済みました。ありがとう! – Alan

+0

ようこそ@Alan –

2

これらのファイル(HTML対コンテンツ)は別のフォルダにありますか? その場合は、セットアップフォルダ、特定のキャッシング年齢

<configuration> 
<location path="[html files path]"> 
    <system.webServer> 
     <staticContent> 
     <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="[your requirement]" ></clientCache> 
     </staticContent> 
    </system.webServer> 
    </location> 
</configuration> 
+0

いいえ、彼らはすべての混在しています。例えば。 there's /articles/article1/index.html and /articles/article1/figure1.png – Alan

1

残念ながら<location>要素はregexまたはwildcardsをサポートしていないことができますので、あなたが求めている正確に何をすることができません。

あなたの目標を達成するには、いくつかの方法が考えられます。最初は、画像への要求を傍受してキャッシングヘッダーを変更するwrite an http moduleです。

もう1つの方法は、あなたのhtmlを変更せずに、すべての画像を画像フォルダに移動することです。そのフォルダにキャッシュルールを設定できます。リダイレクトルールを使用して、イメージの要求をそのイメージフォルダにリダイレクトすることができます。このパスを選択すると、どのように設定するかについての詳細がわかります。

+0

すべてのCDNリクエストをサブディレクトリの下に置いた場合、そのサブディレクトリのキャッシュルールを作成してサブディレクトリを書き直すことは可能でしょうか?例: 1.リクエストはhost.com/CDN/articles/article1/foo.jpgに送信されます。 2.リクエストに長いキャッシュ有効期限が適用されます 3.リクエストはhost.com/articles/article1/fooに書き換えられます。 jpg 4. foo.jpgは/ articles/article1から提供されます – Alan

+1

[IISが書き換えを処理する方法]のためにこれが動作するとは思わない(http://www.iis.net/learn/extensions/url- rewrite-module/iis-url-rewriting-and-aspnet-routing)を参照してください。リライトはリクエスト処理パイプラインの非常に早い段階で起こります。パイプラインの下部が関係する限り、要求は書き換えられたURLから来ているので、同じ問題が発生します。 すべてのイメージを別のフォルダに移動するビルドステップを実行することは現実的ではありませんか? – Sudsy

+0

お返事ありがとうございました。これを試してもらう手間が省けます。すべてのアセットをトップレベルの単一のフォルダに移動することは可能です。 「すべての画像を/ imagesに移動する」など、すべてのアセットタイプについて同様ですが、すべてのアセットをグループ化を表すサブフォルダに移動することは現実的です。例えば。私はhost.jp/CDN/articles/article1/foo.jpgをcdn.host.com/images/foo.jpgに移動する必要があります。何か他の場所にHTMLを変更して新しい場所を指すようにする必要があるからです。どちらも完全にやられますが、迷惑です。 – Alan

関連する問題