前書き
上記のすべてのクライアント(およびプロキシ)で機能するヘッダーの正しい最小セット:
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、またはPython / Flaskの使用:
headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.
Python / Djangoの使用:
response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.
Python / Pyramidの使用:
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.
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>
HTML4の使用:
<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 タグの両方に存在する場合、HTTP応答ヘッダーで<meta http-equiv>
指定されたものがHTMLメタタグよりも優先されるということです。HTMLメタタグは、ページがローカルディスクファイルシステムからfile://
URLを介して表示される場合にのみ使用されます。W3 HTML仕様の章5.2.2も参照してください。プログラムで指定しない場合は、Webサーバーにデフォルト値を含めることができるため、この点に注意してください。
一般に、スターターによる混乱を回避し、ハード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はこのインターネットサイトを開くことができませんでした。リクエストされたサイトは利用できないか、見つかりません。