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