no-cache

no-cache キャッシュ指令 (HTTP)

[17] Cache-Control: ヘッダーno-cache キャッシュ指令は、 検証なしに蓄積された応答再利用してはならないことを表します。 このキャッシュ指令要求でも応答でも利用できます。

仕様書

意味

[2] 要求Cache-Control: ヘッダーにおける no-cache キャッシュ指令は、 キャッシュ起源鯖により検証することなしに既に蓄積された応答再利用してはならないことを示します >>1

[8] 応答Cache-Control: ヘッダーにおける no-cache キャッシュ指令は、 キャッシュ起源鯖により検証することなしに蓄積された応答として再利用してはならないことを示します >>6

[9] ただしヘッダー名が指定された場合は、そのヘッダーのみが検証が必要なことを表しています。

[10] no-cache というキャッシュ指令の名前ではありますが、 キャッシュが保存することは認められています。保存はして構いませんが、 再利用のために検証が必要です。保存すら認めたくない場合には、 no-store を使うことができます。

[27] 応答における Pragma: no-cache の意味は定義されていません >>20 から、構文上応答に含めても問題ないとは言え、 Cache-Control: no-cache のかわりとはできません。

[28] 一部の Webブラウザーは、 HTML文書中の <meta http-equiv=Pragma content=no-cache> のような指定に対応しています。

構文

[4] 要求Cache-Control: ヘッダーでは、 引数は指定できません >>3

[21] 要求Pragma: ヘッダーでは、 引数は指定できません >>20

[22] 仕様上明記されていませんが、 ABNF 構文の意図を推測すると引数を指定することは認められていないようです。

[7] 応答Cache-Control: ヘッダーでは、 引数を指定してもしなくても構いません。 指定する場合はヘッダー名リスト (#) を記述できます >>6

  1. ?
    1. ヘッダー名
    2. *
      1. OWS
      2. ,
      3. OWS
      4. ヘッダー名

[13] ヘッダー名大文字・小文字不区別です >>6

[14] 引数引用文字列とするべきです >>6ヘッダー名が1つだけの時は字句とすることも不可能ではありませんが、 字句とするべきではありません >>6受信者はどちらにも対応するべき (ought to) です >>3

文脈

[24] 要求Pragma: no-cache を指定する時は、 Cache-Control: no-cache も指定するべき (ought to) です。 ただし Cache-Control: で他のキャッシュ指令を指定する時はその限りではありません。 >>20

[25] 例えば

Cache-Control: max-age=30
Pragma: no-cache
... のようにして Cache-Control: に対応しているキャッシュには max-age を適用させ、古いキャッシュには no-cache を適用させることができます。

[26] ただし Cache-Control: に対応していない古いキャッシュがどれだけ現存しているのかは不明です。 現在では Pragma: なしで Cache-Control: のみが指定されることが多いですから、 Pragma: にしか対応できないキャッシュWeb互換とはいえません。

[42] If: ヘッダーを使う場合、 Cache-Control: no-cachePragma: no-cache を使うのが良い >>41 とされています。

If: を参照。

[44] EventSource のための fetch における要求には、 利用者エージェントCache-Control: no-cache を指定するべきです >>43

処理

[5] キャッシュ再利用参照。

[23] 要求Cache-Control: ヘッダーが無い場合、 キャッシュPragma: ヘッダーno-cache 指令Cache-Control: no-cache が指定されたものとして処理しなければなりません >>20

[11] 応答Cache-Control: ヘッダーにおいてヘッダー名が指定されていない場合は、 再利用の前に必ず検証しなければなりません。

[12] 応答Cache-Control: ヘッダーにおいてヘッダー名が指定されている場合は、 キャッシュ再利用しても構いませんが、 指定されているヘッダー検証に成功しないと送信してはなりません >>6

[18] 引数空文字列の場合にどちらなのかはよくわかりません。

[48] bfcache との関係は、 bfcache 参照。

実装

[15] HTTP/1.0 キャッシュには応答Cache-Control: no-cache に対応していないものもあります >>6

[16] Cache-Control: ヘッダーにおけるヘッダー名の指定に対応せず、ヘッダー名なしの場合と同じように処理する実装もあります >>6

[19] Webブラウザースーパーリロードでは Cache-Control: no-cache 付きの要求生成されるのが普通です。通常の再読み込みでも Cache-Control: no-cache が付されることもあります。

IE における <meta http-equiv=Pragma content=no-cache>

[29] WinIE 3.02〜4.01 には、<meta http-equiv="pragma" content="no-cache"> が最初の方にあるとキャッシュにきっちり保存してしまい、 M$ はこれを不具合と認識していました。

Q222064 - "Pragma: No-cache" Tag May Not Prevent Page from Being Cached <http://web.archive.org/web/20010808174139/support.microsoft.com/support/kb/articles/Q222/0/64.ASP>

対策として、この文書では body 要素の後に2つめの head 要素を置き、その中に meta 要素のタグを書けとものすごいことを言っています。例:

<HTML>
<HEAD>
    <META HTTP-EQUIV="REFRESH" CONTENT="5">
    <TITLE> Pragma No-cache </TITLE>
</HEAD>
<BODY>
    This is an example of where to place the second header section<br>
    so that the "Pragama, No-Cache" metatag will work as it is supposed to.<br>
</BODY>
<HEAD>
    <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
</HEAD>
</HTML>

M$ は一体何を考えているのでしょう。英語の意味もついに分からなくなりましたか。

[30] WinIE4 (4.01 SP2 まで) には、 <meta http-equiv="pragma" content="no-cache"> が含まれている文書について、その大きさが64キロオクテット以下ならキャッシュから削除、それより大きければ普通に削除しないという挙動を取っていました。 M$ はこれを不具合と認識し、修正パッチを出しています。

Q234247 - Web Page with "Pragma: No-Cache" Tag Stored in Cache Not Deleted <http://web.archive.org/web/20010816054645/http://support.microsoft.com/support/kb/articles/Q234/2/47.ASP>

[31] Q234067 - HOWTO: Prevent Caching in Internet Explorer <http://web.archive.org/web/20010810040821/support.microsoft.com/support/kb/articles/Q234/0/67.ASP> によれば、 WinIE4 と WinIE5Pragma: no-cache (と HTML 形) を処理してくれるのは over SSL の時だけだそうです。

仕様書に従うなら Pragma: no-cache が使えるのは要求のときで応答のときは駄目なんだ、ほんとは、なーんて珍しくまともなことを言っています。

[32] [HOWTO] Internet Explorer でキャッシュを無効にする ( ( 版)) <http://support.microsoft.com/kb/234067>

応答における Pragma: no-cache

[33] HTTP RFC応答における Pragma: no-cache は意味が定義されておらず、効果は当てにできないしています (>>27)。

[37] >>36 によれば応答Pragma: no-cacheFirefoxOperaChrome が対応しているものの、 IE は対応していないようです。対応している場合、 Cache-Control: ヘッダーの有無に関わらず、 Cache-Control: no-cache と同じ効果を持つようです。

[34] 次のサイトは Cache-Control: no-cache などと併用して Pragma: no-cache応答に含めることでキャッシュを無効化できると説明していますが、 他の解説サイト等のコピペなのか実際に動作を確認したのかは不明です。

歴史

[45] Fix #165: make it clearer "no-cache" revalidates · whatwg/fetch@7adae85 ( 版) <https://github.com/whatwg/fetch/commit/7adae85e7524a9cbff89d8ac39c7d4f01044edce>

[46] 567365 - Cache-Control no-cache on https page disables history () <https://bugzilla.mozilla.org/show_bug.cgi?id=567365>

[47] http - Difference between no-cache and must-revalidate - Stack Overflow () <https://stackoverflow.com/questions/18148884/difference-between-no-cache-and-must-revalidate>

In practice, IE and Firefox have started treating the no-cache directive as if it instructs the browser not to even cache the page. We started observing this behavior about a year ago. We suspect that this change was prompted by the widespread (and incorrect) use of this directive to prevent caching.