PragmaヘッダーとCache-Controlヘッダーの違いは何ですか?


166

私はウィキペディアのプラグマヘッダーについて読みました:

「Pragma:no-cacheヘッダーフィールドは、リクエストで使用することを目的としたHTTP / 1.0ヘッダーです。これは、ブラウザーがサーバーと中間キャッシュにサーバーの代わりに新しいバージョンのリソースが必要であることを伝える手段ですブラウザにリソースをキャッシュしないように指示します。一部のユーザーエージェントは応答のこのヘッダーに注意を払いますが、HTTP / 1.1 RFCはこの動作に依存しないように特に警告しています。」

しかし、私はそれが何をするのか理解していませんか?Cache-Control値がno-cachePragmaあるヘッダーと値もであるヘッダーの違いは何no-cacheですか?

回答:


196

PragmaHTTP / 1.0実装でありcache-control、同じ概念のHTTP / 1.1実装です。どちらも、クライアントが応答をキャッシュしないようにするためのものです。古いクライアントはHTTP / 1.1をサポートしていない可能性があるため、そのヘッダーはまだ使用されています。


31
以下のcnstの答えははるかに複雑ですが、仕様によればはるかに正確です。Pragma: no-cacheリクエストでのみ使用することを意図しており(「キャッシュされたコピーではなく、元のコピーが必要」を意味します)、その動作は応答に対して指定されていません。
2013年

5
Cache-Control: no-cacheはリクエストに対しても同じ意味ですが、実際にはレスポンスに対しても定義されています。つまり、「これのキャッシュされたコピーを将来使用したい場合は、まずそれが最新であることを確認する必要があります(つまり、再検証を実行します)」。
2013年

3
これはキャッシュ制御用であり、キャッシュを防止するためだけのものである必要はありません。「これをキャッシュできます」と言うことにも使用できます。....
jave.web 2015年

基本的な答え。さらに複雑にするために、これはリクエストヘッダーでもあります。つまり、キャッシュをサーバーに送信することもできます。そしてそれは実際には古いコンテンツをクライアントに返すことを意味するかもしれません、何?? これを忘れて、上記の簡単な答えを読んであなたの人生を楽しんでください、それをあまり
深く

どちらも、クライアントが応答をキャッシュしないようにすることを目的としています。またmax-age、キャッシングを妨げないものを持つこともできます。有効期限を設定するだけです...
Honey

97

これはPragmaクライアントによる要求にのみ適用できるものとして定義されていることを除いて、違いはありませんCache-Controlが、クライアントの要求とサーバーの応答の両方で使用できます。

したがって、標準に関する限り、それらはクライアントがリクエストを作成し、サーバーがクライアントからリクエストを受信するという観点からのみ比較できます。http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32は、次のようなシナリオを定義しています。

HTTP / 1.1キャッシュは、「プラグマ:no-cache」を、クライアントが「Cache-Control:no-cache」を送信したかのように扱う必要があります(SHOULD)。新しいプラグマディレクティブはHTTPで定義されません。

  Note: because the meaning of "Pragma: no-cache as a response
  header field is not actually specified, it does not provide a
  reliable replacement for "Cache-Control: no-cache" in a response

上記を読む方法:

  • あなたがクライアントを書いていて必要な場合no-cache

    • サーバーでサポートされてPragma: no-cacheいるかどうかわからない場合Cache-Controlがあるため、リクエストで使用してください。
    • 返信では、キャッシュするかどうかを決定するために、 Cache-Control
  • サーバーを作成している場合:

    • クライアントからのリクエストを解析する際に、以下を確認しCache-Controlます。見つからない場合は、を確認しPragma: no-cacheCache-Control: no-cacheロジックを実行します。
    • 返信では、提供してくださいCache-Control

もちろん、現実は、RFCで記述または暗示されているものとは異なる場合があります。


5
ヘッダーに両方がある場合はどうなりますか?Cache-Control: max-age=86400Pragma: no-cache?それでは、最近のブラウザはどれを尊重しますか?
PKHunter 2017

3
@PKHunter、振る舞いが定義されていない場合、なぜあなたはそれがどの方向に行くのか気にするのですか?サーバーを担当している場合は、クライアントに誤解を招くような情報を提供するよりも明らかに良い方法があります。また、私の回答で指摘したPragma: no-cacheように、はブラウザからのリクエストに対してのみ定義されているため、サーバーからブラウザへの応答では完全に無効であり、定義されていません。たとえば、すべてのブラウザ(最新またはnot)は、受信する可能性のある応答でそのようなヘッダーを無視する必要があります。
cnst 2017

3
最近のブラウザは、両方が存在する場合、Pragmaを優先してPragmaを無視する必要があります。後者は、最初の1.0プロトコルでは利用できなかった期間やその他の情報を指定できるためです。
Randall Borck

17
| Stop using          | Replaced with                    |
| (HTTP 1.0)          | (HTTP 1.1 - 1999)                |
|---------------------|----------------------------------|
| Expires: [date]     | Cache-Control: max-age=[seconds] |
| Pragma: no-cache    | Cache-Control: no-cache          |

それが1999年以降であり、まだExpiresまたはPragmaを使用している場合、それは間違っています。

Stackoverflowを見ています。

200 OK
Pragma: no-cache
Content-Type: application/json
X-Frame-Options: SAMEORIGIN
X-Request-Guid: a3433194-4a03-4206-91ea-6a40f9bfd824
Strict-Transport-Security: max-age=15552000
Content-Length: 54
Accept-Ranges: bytes
Date: Tue, 03 Apr 2018 19:03:12 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-yyz8333-YYZ
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1522782193.766958,VS0,VE30
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Cache-Control: private

tl; dr:PragmaはHTTP / 1.0のレガシーであり、Internet Explorer 5またはNetscape 4.7以降では必要ありません。一部のユーザーがIE5を使用することを期待していない限り、使用を停止しても安全です。


  • 有効期限:( 非推奨-HTTP [date] 1.0)
  • プラグマ:キャッシュなし(非推奨-HTTP 1.0)
  • キャッシュ制御: max-age =[seconds]
  • Cache-Control: no-cache (キャッシュされたコピーを毎回再検証する必要があります)

そして条件付きリクエスト:

  • Etag(エンティティタグ)ベースの条件付きリクエスト
    • サーバ: Etag: W/“1d2e7–1648e509289”
    • クライアント: If-None-Match: W/“1d2e7–1648e509289”
    • サーバ: 304 Not Modified
  • 日付ベースの条件付きリクエストの変更
    • サーバ: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • クライアント: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • サーバ: 304 Not Modified

最終変更日:2019年5月9日木曜日19:15:47 GMT


2
RFCは、クライアントがCache-Controlをサポートしていない場合は、両方を使用する必要があると述べています:tools.ietf.org/html/rfc7234#page-29
Randall

3
クライアントは、 「するべき」、それが御馳走HTTP異なっ/ 1.1およびHTTP / 1.0キャッシュサーバに望んでいない限り-の両方が含まれます。サーバーにはまったく含めないPragmaでください。(HTTP / 1.0では、プラグマは、受信者向けの実装指定のディレクティブの拡張可能なフィールドとして定義されていました。この仕様は、相互運用性を向上させるために、そのような拡張を廃止します。)
Ian Boyd

2
セキュリティの観点から、それを使用することをお勧めします。OWASPでそれを使用することをお勧めしますので、ノーキャッシュディレクティブ:多くのブラウザは、プラグマに続くowasp.org/index.php/...
ランドールBorck

2
@RandallBorck:古くなった(20年前までに)情報を広めています。 1999年を除いて、Pragma指令に準拠しているブラウザーはありません。これはカーゴカルトのアドバイスです。
Piskvorが

2
@Piskvorほとんどのサーバーは1.0と1.1の両方をサポートしているため、HTTP / 1.0リクエストをアクティブにブロックしない限り、クライアントが使用しているプロトコルを選択することはできません。ほとんどの開発者は、今日でも2019年には、それ故にそれはまだベストプラクティスである、1.0をブロックするために気にしないでください
ランドールBorck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.