IIS 7.5がエラーコードでCache-Control Max-Ageを送信しないようにする


10

キャッシュコントロールMax-Ageヘッダーが添付された静的コンテンツがいくつかあるので、クライアントは静的コンテンツをキャッシュします。ただし、IIS 7.5は、クライアントにこれをキャッシュするようにアドバイスするエラー応答がある場合でも、このヘッダーを送信します。

これは、一部のプロキシがそのエラー応答をキャッシュするという悪影響があります。私はできるVary: Accept,Accept-Encodingが、これは実際Max-Ageにはエラー応答に出かけるという根本的な問題に対処していない。

現在関連するIIS web.configセクションは次のとおりです。

<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

クライアントまたはプロキシに400/500エラーコードをキャッシュしないように指示する方法はありますか?


カスタムエラーページを使用していますか?
Justin Niessner、2012年

@ジャスティン-いいえ、今回のケースではありません
Nick Craver

IIS 7.0では、40 *でMax-Ageを送信しません。ただし、IISのバージョン間の相違かどうかはわかりません。
David Murdoch

また、静的コンテンツに500エラーコードを送信させるにはどうすればよいですか。
David Murdoch、2012年

1
たとえば、@ DavidMurdochの場合、ユーザーがJavaScriptをリクエストすると、キャッシュ制御ヘッダー付きで406の応答が送信されますが、クライアントは画像のMIMEタイプしか受け入れません。プロキシはこのキャッシングディレクティブを(仕様どおりに)順守しており、他のユーザーはスクリプトをダウンロードできません。
ジャロッドディクソン

回答:


2

初歩的なテスト「スイート」を作成しました。

IIS 7.0の最小限のWeb.config(.NET 4.0の統合piplineモード)でテストを実行すると、すべてが成功します。テストファイルのCache-Control応答ヘッダーは、private要求のAcceptヘッダーがファイルのヘッダーと一致しない場合に設定されますContent-Type

これにより、IISの静的キャッシュルーチンを中断しているモジュールがあるか、IIS 7.0と7.5ではここが異なると思います。

ここに私が使用したファイルがあります(some-script.js空のファイルなのでsans です):

Web.Config:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0">
        </compilation>
    </system.web>
    <system.webServer>
        <staticContent>
            <!-- Set expire headers to 30 days for static content-->
            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
        </staticContent>
    </system.webServer>
</configuration>

test.html:

<!doctype html>
<html>
<head>
    <title>http://serverfault.com/questions/346975</title>
    <style>
        body > div
        {
            border:1px solid;
            padding:10px;
            margin:10px;
        }
    </style>
</head>
    <body>
        <div>
            <h2>Request JS file with Accepts: accept/nothing</h2>
            <b>Response Headers: </b>
            <pre id="responseHeaders-1">loading&hellip</pre>
        </div>

        <div>
            <h2>Request JS file with Accepts: */*</h2>
            <b>Response Headers: </b>
            <pre id="responseHeaders-2">loading&hellip</pre>
        </div>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
        <script>
            var responseHeaders1 = $("#responseHeaders-1"),
                responseHeaders2 = $("#responseHeaders-2"),
                fetchScript = function (accepts, element, successMsg, errorMsg) {

                    var jXhr = $.ajax({
                        // fetch the resource "fresh" each time since we are testing the Cache-Control header and not caching itself
                        "url": "some-script.js?" + (new Date).getTime(),
                        "headers": {
                            "Accept" : accepts
                        },
                        "complete": function () {
                            var headers = jXhr.getAllResponseHeaders();
                            headers = headers.replace(/(Cache-Control:.+)/i, "<strong><u>$1</u></strong>");
                            element.html(headers);
                        },
                        "success": function () {
                            element.after("<div>" + successMsg + "</div>");
                        },
                        "error": function () {
                            element.after("<div>" + errorMsg + "</div>");
                        }
                    });
                };

                fetchScript("accept/nothing", responseHeaders1, "Uh, your server is sending stuff when the client doesn't accept it.", "Your server (probably) responded correctly.");
                fetchScript("*/*", responseHeaders2, "Your server responded correctly.", "Something went wrong.");
        </script>
    </body>
</html>

localhostへのリクエストを使用して、調査結果を再現できます。リモートマシンから同じテストを実行してみましたか?
Geoff Dalgas

はい、そうしました。se.vervestudios.co/tests/se-test/test.html(将来の人々へのメモ、以前のリンクは一時的なテストの目的のみであり、おそらくもう機能しません、申し訳ありません)
David Murdoch

その応答に埋め込まれたエラーは、いくぶん危険な情報を公開します- こちらをご覧ください。サーバーはすべてのリクエストがローカルで発行されたと信じているようです-iis.net/ConfigReference/system.webServer/httpErrorsを参照してください :<httpErrors errorMode = "Custom" />を介してCustomErrorsを有効にすると、@と同じ問題が発生しますデビッド
ジェフダルガス

0

キャッシュするコンテンツのタイプを指定する必要があります。たとえば、スクリプト、css、imageなどをキャッシュできます。<location path ="Scripts">タグの前に<system.webServer>タグを使用してください。したがって、Web構成は次のようになります。

 <location path ="Scripts">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="07:00:00" />
      </staticContent>
    </system.webServer>
  </location>
  <location path ="css">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="07:00:00" />
      </staticContent>
    </system.webServer>
 </location>

それは本当にこの質問に対処していますか?
ひよこ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.