1765

調査の結果、すべてのブラウザーが HTTP キャッシュ ディレクティブを一律に尊重しているわけではないことがわかりました。

セキュリティ上の理由から、アプリケーション内の特定のページが Web ブラウザーによってキャッシュされることは望ましくありません。これは、少なくとも次のブラウザーで機能する必要があります。

  • Internet Explorer 6 以降
  • Firefox 1.5+
  • サファリ 3+
  • オペラ 9+
  • クロム

私たちの要件は、セキュリティ テストから得られたものです。当社のウェブサイトからログアウトした後、戻るボタンを押してキャッシュされたページを表示できます。

4

29 に答える 29

2936

序章

上記のすべてのクライアント (およびプロキシ) で機能するヘッダーの正しい最小セット:

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

Cache-Control、クライアントとプロキシの HTTP 1.1 仕様に準拠しています (また、 の横にある一部のクライアントでは暗黙的に必要とされますExpires)。これPragmaは、先史時代のクライアントの HTTP 1.0 仕様に基づいています。これExpiresは、クライアントとプロキシの HTTP 1.0 および 1.1 仕様に準拠しています。HTTP 1.1 では、Cache-Controlが よりも優先されるExpiresため、結局は HTTP 1.0 プロキシ専用です。

のみで HTTPS 経由でページを提供するときに IE6 とその壊れたキャッシュを気にしない場合はno-store、省略できますCache-Control: no-cache

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

IE6 クライアントも HTTP 1.0 クライアントも気にしない場合 (HTTP 1.1 は 1997 年に導入されました)、省略できますPragma

Cache-Control: no-store, must-revalidate
Expires: 0

HTTP 1.0 プロキシも気にしない場合は、省略できますExpires

Cache-Control: no-store, must-revalidate

一方、サーバーが有効なDateヘッダーを自動インクルードする場合、理論的には省略してのみCache-Controlに依存することができますExpires

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

しかし、たとえばエンドユーザーがオペレーティング システムの日付を操作し、クライアント ソフトウェアがそれに依存している場合、これは失敗する可能性があります。

上記のパラメータが指定されている場合、Cache-Controlなどの他のパラメータmax-ageは無関係です。Cache-ControlここLast-Modifiedにある他のほとんどの回答に含まれているヘッダーは、実際にリクエストをキャッシュしたい場合にのみ興味深いので、指定する必要はまったくありません。

設定方法は?

PHP の使用:

header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.

Java サーブレットまたは Node.js を使用する場合:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.

ASP.NET-MVC の使用

Response.Cache.SetCacheability(HttpCacheability.NoCache);  // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

ASP.NET Web API の使用:

// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
    NoCache = true,
    NoStore = true,
    MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString()); 

ASP.NET の使用:

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

ASP.NET Core v3 の使用

// using Microsoft.Net.Http.Headers
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
Response.Headers[HeaderNames.Expires] = "0";
Response.Headers[HeaderNames.Pragma] = "no-cache";

ASP の使用:

Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.

Ruby on Rails の使用:

headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.

Python/フラスコの使用:

response = make_response(render_template(...))
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response.headers["Pragma"] = "no-cache" # HTTP 1.0.
response.headers["Expires"] = "0" # Proxies.

Python/ジャンゴの使用:

response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.

Python/ピラミッドの使用:

request.response.headerlist.extend(
    (
        ('Cache-Control', 'no-cache, no-store, must-revalidate'),
        ('Pragma', 'no-cache'),
        ('Expires', '0')
    )
)

Go を使用する:

responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.

Clojure の使用 (Ring utils が必要):

(require '[ring.util.response :as r])
(-> response
  (r/header "Cache-Control" "no-cache, no-store, must-revalidate")
  (r/header "Pragma" "no-cache")
  (r/header "Expires" 0))

Apache.htaccessファイルの使用:

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

HTML の使用:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

HTML メタ タグと HTTP 応答ヘッダー

HTML ページが HTTP 接続を介して提供され、ヘッダーがHTTP 応答ヘッダーと HTML タグの両方<meta http-equiv>に存在する場合、HTTP 応答ヘッダーで指定されたものが HTML メタ タグよりも優先されることを知っておくことが重要です。HTML メタ タグは、ページがfile://URL 経由でローカル ディスク ファイル システムから表示される場合にのみ使用されます。W3 HTML 仕様の章 5.2.2も参照してください。ウェブサーバーにはいくつかのデフォルト値が含まれている可能性があるため、プログラムで指定しない場合は注意してください。

一般に、スターターによる混乱を避け、ハード HTTP 応答ヘッダーに依存するために、HTML メタ タグを指定しない方がよいでしょう。さらに、特にこれらの<meta http-equiv>タグはHTML5 では無効です。HTML5 仕様http-equivにリストされている値のみが許可されます。

実際の HTTP 応答ヘッダーの確認

どちらか一方を確認するには、Web ブラウザーの開発者ツールセットの HTTP トラフィック モニターで表示/デバッグできます。Chrome/Firefox23+/IE9+ で F12 を押し、[ネットワーク] または [ネット] タブ パネルを開き、目的の HTTP 要求をクリックして、HTTP 要求と応答に関するすべての詳細を表示すると、そこに到達できます。以下のスクリーンショットは Chrome のものです。

stackoverflow.com の HTTP 応答ヘッダーを表示する Chrome 開発者ツールセット HTTP トラフィック モニター

ファイルのダウンロードにもこれらのヘッダーを設定したい

まず、この質問と回答は「ファイルのダウンロード」(PDF、zip、Excel など) ではなく、「Web ページ」(HTML ページ) を対象としています。それらをキャッシュし、URI パスまたはクエリ文字列のどこかにあるファイル バージョン識別子を使用して、変更されたファイルの再ダウンロードを強制することをお勧めします。とにかくファイルのダウンロードにこれらのキャッシュなしヘッダーを適用する場合は、HTTP ではなく HTTPS 経由でファイルのダウンロードを提供するときの IE7/8 のバグに注意してください。詳しくは、IE が foo.jsf をダウンロードできないを参照してください。IE はこのインターネット サイトを開くことができませんでした。要求されたサイトは利用できないか、見つかりません

于 2010-01-14T23:50:18.593 に答える
271

(ねえ、みんな:見つけたすべてのヘッダーをうっかりコピーして貼り付けないでください)

まず第一に、戻るボタンの履歴はキャッシュではありません

鮮度モデル(セクション4.2)は、必ずしも履歴メカニズムに適用されるわけではありません。つまり、履歴メカニズムは、期限切れになった場合でも以前の表現を表示できます。

古いHTTP仕様では、文言はさらに強力で、戻るボタンの履歴のキャッシュディレクティブを無視するようにブラウザに明示的に指示していました。

Backは、(ユーザーがログインしたときまでの)時間に戻ることになっています。以前に開いたURLに移動することはありません。

ただし、実際には、非常に特殊な状況では、キャッシュが戻るボタンに影響を与える可能性があります。

  • ページはHTTPS経由で配信する必要があります。そうしないと、このキャッシュバスティングは信頼できません。さらに、HTTPSを使用していない場合、ページは他の多くの方法でログインを盗むことに対して脆弱です。
  • 送信する必要がありますCache-Control: no-store, must-revalidate(一部のブラウザは監視no-storeし、一部は監視しますmust-revalidate

次のいずれも必要ありません

  • <meta>キャッシュヘッダー付き—まったく機能しません。全く役に立たない。
  • post-check/ —これは、キャッシュ可能なリソースpre-checkにのみ適用されるIEのみのディレクティブです。
  • 同じヘッダーを2回または12回に分けて送信します。一部のPHPスニペットは、実際には以前のヘッダーを置き換え、最後のヘッダーのみが送信されます。

必要に応じて、次を追加できます。

  • no-cacheまたはmax-age=0、リソース(URL)を「古く」し、ブラウザが新しいバージョンがあるかどうかをサーバーに確認する必要があります(no-storeこれはすでにこれがさらに強力であることを意味します)。
  • ExpiresHTTP / 1.0クライアントの過去の日付があります(ただし、実際のHTTP / 1.0のみのクライアントは最近完全に存在しません)。

ボーナス:新しいHTTPキャッシングRFC

于 2011-03-30T23:08:03.797 に答える
123

@Kornel が述べたように、必要なのはキャッシュを非アクティブ化することではなく、履歴バッファーを非アクティブ化することです。さまざまなブラウザーには、履歴バッファーを無効にする独自の微妙な方法があります。

Chrome (v28.0.1500.95 m) では、Cache-Control: no-store.

FireFox (v23.0.1) では、次のいずれかが機能します。

  1. Cache-Control: no-store

  2. Cache-Control: no-cache(httpsのみ)

  3. Pragma: no-cache(httpsのみ)

  4. Vary: *(httpsのみ)

Opera (v12.15) では、Cache-Control: must-revalidate(https のみ) でのみこれを行うことができます。

Safari (v5.1.7、7534.57.2) では、次のいずれかが機能します。

  1. Cache-Control: no-store
    <body onunload="">htmlで

  2. Cache-Control: no-store(httpsのみ)

IE8 (v8.0.6001.18702IC) では、次のいずれかが機能します。

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate
    Expires: 0

  5. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache(httpsのみ)

  7. Vary: *(httpsのみ)

上記を組み合わせることで、Chrome 28、FireFox 23、IE8、Safari 5.1.7、および Opera 12.15 で機能する次のソリューションが得られます: Cache-Control: no-store, must-revalidate (https のみ)

Opera はプレーンな http ページの履歴バッファを非アクティブ化しないため、https が必要であることに注意してください。本当に https を取得できず、Opera を無視する準備ができている場合は、次のことを行うことが最善の方法です。

Cache-Control: no-store
<body onunload="">

以下は、私のテストの生ログを示しています。

HTTP:

  1. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Opera 12.15
    成功: Chrome 28、FireFox 23、IE8、Safari 5.1.7

  2. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Opera 12.15
    成功: Chrome 28、FireFox 23、IE8、Safari 5.1.7

  3. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    失敗: Safari 5.1.7、Opera 12.15
    成功: Chrome 28、FireFox 23、IE8

  4. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    失敗: Safari 5.1.7、Opera 12.15
    成功: Chrome 28、FireFox 23、IE8

  5. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  6. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  7. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  8. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  9. Cache-Control: no-store
    失敗: Safari 5.1.7、Opera 12.15
    成功: Chrome 28、FireFox 23、IE8

  10. Cache-Control: no-store
    <body onunload="">
    失敗: Opera 12.15
    成功: Chrome 28、FireFox 23、IE8、Safari 5.1.7

  11. Cache-Control: no-cache
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  12. Vary: *
    失敗: Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15
    成功: なし

  13. Pragma: no-cache
    失敗: Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15
    成功: なし

  14. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  15. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  16. Cache-Control: must-revalidate, max-age=0
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15
    成功: IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15
    成功: なし

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    失敗: Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15
    成功: なし

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    失敗: Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15
    成功: なし

  3. Vary: *
    失敗: Chrome 28、Safari 5.1.7、Opera 12.15
    成功: FireFox 23、IE8

  4. Pragma: no-cache
    失敗: Chrome 28、Safari 5.1.7、Opera 12.15
    成功: FireFox 23、IE8

  5. Cache-Control: no-cache
    失敗: Chrome 28、Safari 5.1.7、Opera 12.15
    成功: FireFox 23、IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    失敗: Chrome 28、Safari 5.1.7、Opera 12.15
    成功: FireFox 23、IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    失敗: Chrome 28、Safari 5.1.7、Opera 12.15
    成功: FireFox 23、IE8

  8. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    失敗: Chrome 28、Safari 5.1.7、Opera 12.15
    成功: FireFox 23、IE8

  9. Cache-Control: must-revalidate
    失敗: Chrome 28、FireFox 23、IE8、Safari 5.1.7
    成功: Opera 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    失敗: Chrome 28、FireFox 23、IE8、Safari 5.1.7
    成功: Opera 12.15

  11. Cache-Control: must-revalidate, max-age=0
    失敗: Chrome 28、FireFox 23、Safari 5.1.7
    成功: IE8、Opera 12.15

  12. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Chrome 28、Safari 5.1.7
    成功: FireFox 23、IE8、Opera 12.15

  13. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Chrome 28、Safari 5.1.7
    成功: FireFox 23、IE8、Opera 12.15

  14. Cache-Control: no-store
    失敗: Opera 12.15
    成功: Chrome 28、FireFox 23、IE8、Safari 5.1.7

  15. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Opera 12.15
    成功: Chrome 28、FireFox 23、IE8、Safari 5.1.7

  16. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    失敗: Opera 12.15
    成功: Chrome 28、FireFox 23、IE8、Safari 5.1.7

  17. Cache-Control: private, no-cache
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    失敗: Chrome 28、Safari 5.1.7、Opera 12.15
    成功: FireFox 23、IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、
    成功: IE8、Opera 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、
    成功: IE8、Opera 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、
    成功: IE8、Opera 12.15

  21. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    失敗: Chrome 28、FireFox 23、Safari 5.1.7、
    成功: IE8、Opera 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    失敗: Chrome 28、Safari 5.1.7
    成功: FireFox 23、IE8、Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    失敗: なし
    成功: Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15

于 2013-08-29T16:50:36.277 に答える
47

web.configルートが便利だと思いました(回答に追加しようとしましたが、受け入れられなかったようですので、ここに投稿してください)

<configuration>
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
            <!-- HTTP 1.1. -->
            <add name="Pragma" value="no-cache" />
            <!-- HTTP 1.0. -->
            <add name="Expires" value="0" />
            <!-- Proxies. -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

そして、これが同じことを行うexpress /node.jsの方法です:

app.use(function(req, res, next) {
    res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
    res.setHeader('Pragma', 'no-cache');
    res.setHeader('Expires', '0');
    next();
});
于 2012-06-15T02:40:53.253 に答える
35

このページのすべての回答にはまだ問題があることがわかりました。特に、戻るボタンを押してページにアクセスしたときに、IE8 がページのキャッシュされたバージョンを使用するのを止めるものは何もないことに気付きました。

多くの調査とテストを行った結果、本当に必要なヘッダーは次の 2 つだけであることがわかりました。

Cache-Control: no-store
Vary: *

Vary ヘッダーの説明については、http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6 を参照してください。

IE6-8、FF1.5-3.5、Chrome 2-3、Safari 4、および Opera 9-10 では、これらのヘッダーが原因で、ページへのリンクをクリックしたり URL を入力したりすると、サーバーからページが要求されました。アドレスバーに直接。これは、2010 年 1 月の時点で使用されているすべてのブラウザーの約99%をカバーしています。

IE6 および Opera 9-10 では、[戻る] ボタンを押すと、キャッシュされたバージョンが読み込まれました。私がテストした他のすべてのブラウザーでは、サーバーから新しいバージョンを取得しました。これまでのところ、戻るボタンを押したときにこれらのブラウザーがページのキャッシュ バージョンを返さない原因となる一連のヘッダーは見つかりませんでした。

更新: この回答を書いた後、私たちの Web サーバーが自身を HTTP 1.0 サーバーとして識別していることに気付きました。リストしたヘッダーは、HTTP 1.0 サーバーからの応答がブラウザーによってキャッシュされないようにするための正しいヘッダーです。HTTP 1.1 サーバーについては、BalusC の回答をご覧ください。

于 2010-01-14T23:35:52.623 に答える
26

少し調査した結果、ほとんどのブラウザーをカバーしていると思われるヘッダーの次のリストを思いつきました。

ASP.NET では、次のスニペットを使用してこれらを追加しました。

Response.ClearHeaders(); 
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0 
Response.AppendHeader("Expires", "Sat, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0 

から見つけた: http://forums.asp.net/t/1013531.aspx

于 2008-09-08T12:11:57.660 に答える
10

応答でのプラグマ ヘッダーの使用は、妻の話です。RFC2616 では、リクエスト ヘッダーとしてのみ定義されています。

http://www.mnot.net/cache_docs/#PRAGMA

于 2008-09-17T14:18:00.653 に答える
9

IE6にバグがあります

「Content-Encoding: gzip」のコンテンツは、「Cache-Control: no-cache」を使用しても常にキャッシュされます。

http://support.microsoft.com/kb/321722

IE6 ユーザーの gzip 圧縮を無効にすることができます ("MSIE 6" のユーザー エージェントを確認してください)。

于 2013-06-13T15:23:52.853 に答える
9

免責事項:@BalusCの回答を読むことを強くお勧めします。次のキャッシング チュートリアルを読んだ後: http://www.mnot.net/cache_docs/ (こちらもお読みになることをお勧めします)、それは正しいと思います。ただし、歴史的な理由から (および私が自分でテストしたため)、元の回答を以下に示します。


PHPの「受け入れられた」回答を試しましたが、うまくいきませんでした。それから私は少し調査を行い、わずかな亜種を見つけてテストし、それが機能しました. ここにあります:

header('Cache-Control: no-store, private, no-cache, must-revalidate');     // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false);  // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');                  // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');

それはうまくいくはずです。問題は、ヘッダーの同じ部分を 2 回設定するときにfalse、ヘッダー関数の 2 番目の引数として が送信されない場合、ヘッダー関数が前のheader()呼び出しを単純に上書きすることでした。したがって、 を設定するとき、たとえば、すべての引数を 1 つの関数呼び出しCache-Controlに入れたくない場合は、次のようにする必要があります。header()

header('Cache-Control: this');
header('Cache-Control: and, this', false);

ここでより完全なドキュメントを参照してください。

于 2008-09-18T10:36:40.457 に答える
9

ASP.NET Core の場合は、単純なミドルウェア クラスを作成します。

public class NoCacheMiddleware
{
    private readonly RequestDelegate m_next;

    public NoCacheMiddleware( RequestDelegate next )
    {
        m_next = next;
    }

    public async Task Invoke( HttpContext httpContext )
    {
        httpContext.Response.OnStarting( ( state ) =>
        {
            // ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
            httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
            httpContext.Response.Headers.Append( "Pragma", "no-cache" );
            httpContext.Response.Headers.Append( "Expires", "0" );
            return Task.FromResult( 0 );
        }, null );

        await m_next.Invoke( httpContext );
    }
}

次に、それを登録しますStartup.cs

app.UseMiddleware<NoCacheMiddleware>();

これを後でどこかに追加してください

app.UseStaticFiles();
于 2016-05-19T19:55:19.523 に答える
8

これらのディレクティブは、セキュリティ リスクを軽減しません。これらは、UA が揮発性情報を更新することを強制することを実際に意図しており、UA が情報を保持するのを妨げることはありません。この同様の質問を参照してください。少なくとも、ルーターやプロキシなどがキャッシュ ディレクティブを無視しないという保証はありません。

さらに良いことに、コンピュータへの物理的なアクセス、ソフトウェアのインストールなどに関するポリシーにより、セキュリティの面でほとんどの企業よりもはるかに優位に立つことができます。この情報の消費者が公衆のメンバーである場合、あなたが実際にできる唯一のことは、情報が彼らのマシンに到達すると、そのマシンはあなたの責任ではなく彼らの責任であることを彼らに理解させることです.

于 2008-09-19T03:08:52.367 に答える
7

SSL 経由の IE6-IE8 および MS Office ファイルの cache:no-cache ヘッダー (および同様の値) でダウンロードの問題に直面している場合は、cache:private,no-store ヘッダーを使用して、POST 要求でファイルを返すことができます。できます。

于 2012-09-21T09:02:33.700 に答える
7

変更された http ヘッダーを 1995 年の日付に設定すると、通常はうまくいきます。

次に例を示します。

有効期限: 1995 年 11 月 15 日水曜日 04:58:08 GMT
最終更新日: 1995 年 11 月 15 日水曜日 04:58:08 GMT
キャッシュ制御: キャッシュなし、再検証が必要
于 2008-09-08T12:10:33.653 に答える
7

HTTP 1.1の RFC によると、適切な方法は次の HTTP ヘッダーを追加することです。

キャッシュ制御: キャッシュなし

古いブラウザは、HTTP 1.1 に適切に準拠していない場合、これを無視することがあります。それらについては、ヘッダーを試すことができます:

プラグマ: no-cache

これは、HTTP 1.1 ブラウザでも機能するはずです。

于 2008-09-08T12:14:57.700 に答える
7

ヘッダー関数のPHP ドキュメントには、かなり完全な例があります (サードパーティによる寄稿):

    header('Pragma: public');
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");                  // Date in the past   
    header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');     // HTTP/1.1
    header('Cache-Control: pre-check=0, post-check=0, max-age=0', false);    // HTTP/1.1
    header ("Pragma: no-cache");
    header("Expires: 0", false);
于 2008-09-08T12:19:23.073 に答える
5

受け入れられた回答は、II7 で送信されないキャッシュ ヘッダーに関する多数の質問により、IIS7+ では機能しないようです。

等々

受け入れられた答えは、どのヘッダーを設定する必要があるかでは正しいですが、どのように設定する必要があるかではありません。この方法は IIS7 で機能します。

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");

最初の行は に設定Cache-controlno-cache、2 行目は他の属性を追加します。no-store, must-revalidate

于 2014-03-18T00:45:57.997 に答える
4

Pragma:no-cacheを設定することにより、すべてのブラウザーで最良かつ最も一貫した結果が得られました。

于 2008-09-17T12:32:53.387 に答える
4

BalusC によって提供された回答のヘッダーは、ブラウザーの戻るボタンを使用するときに、Safari 5 (およびおそらく古いバージョンも) がブラウザー キャッシュからコンテンツを表示することを妨げません。これを防ぐ方法は、body タグに空の onunload イベント ハンドラー属性を追加することです。

<body onunload=""> 

このハックは Safari のバックフォワード キャッシュを壊すようです:戻るボタンをクリックしたときに、クロス ブラウザーの onload イベントはありますか?

于 2011-04-23T21:24:11.147 に答える
3
//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>
于 2013-02-06T08:52:53.160 に答える
3

ヘッダーに加えて、https経由でページを提供することを検討してください。多くのブラウザはデフォルトで https をキャッシュしません。

于 2008-11-19T08:31:33.487 に答える
1

BalusCを完了するには-> ANSWER Perl を使用している場合は、CGI を使用して HTTP ヘッダーを追加できます。

Perl の使用:

Use CGI;    
sub set_new_query() {
        binmode STDOUT, ":utf8";
        die if defined $query;
        $query = CGI->new();
        print $query->header(
                        -expires       => 'Sat, 26 Jul 1997 05:00:00 GMT',
                        -Pragma        => 'no-cache',
                        -Cache_Control => join(', ', qw(
                                            private
                                            no-cache
                                            no-store
                                            must-revalidate
                                            max-age=0
                                            pre-check=0
                                            post-check=0 
                                           ))
        );
    }

Apache httpd.conf の使用

<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>

注: HTML META を使用しようとすると、ブラウザーはそれらを無視し、ページをキャッシュしました。

于 2014-02-13T12:12:40.497 に答える
0

キャッシングに関するケース スタディへのリンクを参照してください。

http://securityevaluators.com/knowledge/case_studies/caching/

要約すると、記事によると、Cache-Control: no-storeChrome、Firefox、および IE でのみ機能します。IE は他のコントロールを受け入れますが、Chrome と Firefox は受け入れません。このリンクは、キャッシングの歴史と概念実証の文書化を完全にまとめた優れた読み物です。

于 2014-07-03T14:51:34.113 に答える
0

誰かが動的コンテンツのみをキャッシュしないようにしたい場合は、それらの追加ヘッダーをプログラムで追加する必要があることを指摘したいだけです。

プロジェクトの構成ファイルを編集してキャッシュなしヘッダーを追加しましたが、静的コンテンツのキャッシュも無効になりました。これは通常望ましくありません。コード内の応答ヘッダーを変更すると、画像とスタイル ファイルが確実にキャッシュされます。

これは非常に明白ですが、それでも言及する価値があります。

そしてもう一つ注意。HttpResponse クラスの ClearHeaders メソッドの使用には注意してください。むやみに使用すると傷がつく場合があります。それが私に与えたように。

ActionFilterAttribute イベントでリダイレクトした後、すべてのヘッダーをクリアすると、すべてのセッション データと TempData ストレージ内のデータが失われます。アクションからリダイレクトするか、リダイレクトが行われているときにヘッダーをクリアしない方が安全です。

考え直して、ClearHeaders メソッドを使用することをすべて思いとどまらせます。ヘッダーを個別に削除することをお勧めします。Cache-Control ヘッダーを適切に設定するために、次のコードを使用しています。

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");
于 2014-05-20T12:35:10.247 に答える