[17] [CODE(HTTP)@en[[[Cache-Control:]]]] [[ヘッダー]]の
[DFN[[CODE(HTTP)@en[[[no-cache]]]]]] [[キャッシュ指令]]は、
[[検証]]なしに[[蓄積された応答]]を[[再利用]]してはならないことを表します。
この[[キャッシュ指令]]は[[要求]]でも[[応答]]でも利用できます。

* 仕様書

[REFS[
- [3] [CITE@en[RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching]] ([TIME[2014-09-11 10:19:59 +09:00]] 版) <https://tools.ietf.org/html/rfc7234#section-5.2>
-- [1] '''[CITE@en[RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching]] ([TIME[2014-09-11 10:19:59 +09:00]] 版) <https://tools.ietf.org/html/rfc7234#section-5.2.1.4>'''
-- [6] '''[CITE@en[RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching]] ([TIME[2014-09-11 10:19:59 +09:00]] 版) <https://tools.ietf.org/html/rfc7234#section-5.2.2.2>'''
- [20] [CITE@en[RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching]] ([TIME[2014-09-11 10:19:59 +09:00]] 版) <https://tools.ietf.org/html/rfc7234#section-5.4>
- [41] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-10.4>
- [43] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-12-04 10:25:09 +09:00]] 版) <https://html.spec.whatwg.org/#processing-model-10:http-cache-control>
]REFS]

* 意味

[2] [[要求]]の [CODE(HTTP)@en[[[Cache-Control:]]]] [[ヘッダー]]における
[DFN[[CODE(HTTP)@en[[[no-cache]]]]]] [[キャッシュ指令]]は、
[[キャッシュ]]が[[起源鯖]]により[[検証]]することなしに既に[[蓄積された応答]]を[[再利用]]しては[['''ならない''']]ことを示します
[SRC[>>1]]。

[8] [[応答]]の [CODE(HTTP)@en[[[Cache-Control:]]]] [[ヘッダー]]における
[DFN[[CODE(HTTP)@en[[[no-cache]]]]]] [[キャッシュ指令]]は、
[[キャッシュ]]が[[起源鯖]]により[[検証]]することなしに[[蓄積された応答]]として[[再利用]]しては[['''ならない''']]ことを示します
[SRC[>>6]]。

[9] ただし[[ヘッダー名]]が指定された場合は、その[[ヘッダー]]のみが[[検証]]が必要なことを表しています。

;; [10] [CODE(HTTP)@en[[[no-cache]]]] という[[キャッシュ指令]]の名前ではありますが、
[[キャッシュ]]が保存することは認められています。保存はして構いませんが、
[[再利用]]のために[[検証]]が必要です。保存すら認めたくない場合には、
[CODE(HTTP)@en[[[no-store]]]] を使うことができます。

[27] [[応答]]における [CODE(HTTP)@en[[[Pragma:]] [[no-cache]]]] の意味は定義されていません
[SRC[>>20]] から、構文上[[応答]]に含めても問題ないとは言え、
[CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]] のかわりとはできません。

[28] 一部の [[Webブラウザー]]は、 [[HTML文書]]中の
[CODE(HTML)@en[<[[meta]] [[http-equiv]]=[[Pragma]] [[content]]=[[no-cache]]>]]
のような指定に対応しています。

* 構文

[4] [[要求]]の [CODE(HTTP)@en[[[Cache-Control:]]]] [[ヘッダー]]では、
[[引数]]は指定できません [SRC[>>3]]。

[21] [[要求]]の [CODE(HTTP)@en[[[Pragma:]]]] [[ヘッダー]]では、
[[引数]]は指定できません [SRC[>>20]]。

;; [22] 仕様上明記されていませんが、 [[ABNF]] 構文の意図を推測すると[[引数]]を指定することは認められていないようです。

[7] [[応答]]の [CODE(HTTP)@en[[[Cache-Control:]]]] [[ヘッダー]]では、
[[引数]]を指定してもしなくても構いません。
指定する場合は[[ヘッダー名]]の[[リスト]] ([CODE(HTTP)[#]]) を記述できます [SRC[>>6]]。

[FIG(railroad)[
= ?
== [[ヘッダー名]]
== *
=== [[OWS]]
=== [CODE(HTTP)[[[,]]]]
=== [[OWS]]
=== [[ヘッダー名]]
]FIG]

[13] [[ヘッダー名]]は[[大文字・小文字不区別]]です [SRC[>>6]]。

[14] [[引数]]は[[引用文字列]]とする[['''べきです''']] [SRC[>>6]]。
[[ヘッダー名]]が1つだけの時は[[字句]]とすることも不可能ではありませんが、
[[字句]]とする[['''べきではありません''']] [SRC[>>6]]。
[[受信者]]はどちらにも対応する[RUBYB[べき]@en[ought to]]です [SRC[>>3]]。

* 文脈

[24] [[要求]]で [CODE(HTTP)@en[[[Pragma:]] [[no-cache]]]] を指定する時は、
[CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]] も指定する[RUBYB[べき]@en[ought to]]です。
ただし [CODE(HTTP)@en[[[Cache-Control:]]]] で他の[[キャッシュ指令]]を指定する時はその限りではありません。
[SRC[>>20]]

[EG[
[25] 例えば
[PRE(HTTP code)[
Cache-Control: max-age=30
Pragma: no-cache
]PRE]
... のようにして [CODE(HTTP)@en[[[Cache-Control:]]]] に対応している[[キャッシュ]]には
[CODE(HTTP)@en[[[max-age]]]] を適用させ、古い[[キャッシュ]]には
[CODE(HTTP)@en[[[no-cache]]]] を適用させることができます。
]EG]

;; [26] ただし [CODE(HTTP)@en[[[Cache-Control:]]]] に対応していない古い[[キャッシュ]]がどれだけ現存しているのかは不明です。
現在では [CODE(HTTP)@en[[[Pragma:]]]] なしで [CODE(HTTP)@en[[[Cache-Control:]]]]
のみが指定されることが多いですから、 [CODE(HTTP)@en[[[Pragma:]]]]
にしか対応できない[[キャッシュ]]は[[Web互換]]とはいえません。

[42] [CODE(HTTP)@en[[[If:]]]] [[ヘッダー]]を使う場合、 
[CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]] と
[CODE(HTTP)@en[[[Pragma:]] [[no-cache]]]] を使うのが良い [SRC[>>41]] とされています。

;; [CODE(HTTP)@en[[[If:]]]] を参照。

[44] [CODE(DOMi)@en[[[EventSource]]]] のための [[fetch]] における[[要求]]には、
[[利用者エージェント]]は [CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]]
を指定する[['''べきです''']] [SRC[>>43]]。

* 処理

[5] [[キャッシュ再利用]]参照。

[23] [[要求]]に [CODE(HTTP)@en[[[Cache-Control:]]]] [[ヘッダー]]が無い場合、
[[キャッシュ]]は [CODE(HTTP)@en[[[Pragma:]]]] [[ヘッダー]]の
[CODE(HTTP)@en[[[no-cache]]]] [[指令]]を [CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]]
が指定されたものとして処理しなければ[['''なりません''']] [SRC[>>20]]。

[11] [[応答]]の [CODE(HTTP)@en[[[Cache-Control:]]]] [[ヘッダー]]において[[ヘッダー名]]が指定されていない場合は、
[[再利用]]の前に必ず[[検証]]しなければなりません。

[12] [[応答]]の [CODE(HTTP)@en[[[Cache-Control:]]]] [[ヘッダー]]において[[ヘッダー名]]が指定されている場合は、
[[キャッシュ]]は[[再利用]]しても構いませんが、
指定されている[[ヘッダー]]は[[検証]]に成功しないと[[送信]]しては[['''なりません''']]
[SRC[>>6]]。

;; [18] [[引数]]が[[空文字列]]の場合にどちらなのかはよくわかりません。

[48] 
[[bfcache]] との関係は、 [[bfcache]] 参照。


* 実装

[15] [[HTTP/1.0]] [[キャッシュ]]には[[応答]]の [CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]]
に対応していないものもあります [SRC[>>6]]。

[16] [CODE(HTTP)@en[[[Cache-Control:]]]] [[ヘッダー]]における[[ヘッダー名]]の指定に対応せず、[[ヘッダー名]]なしの場合と同じように処理する実装もあります
[SRC[>>6]]。

[19] [[Webブラウザー]]の[[スーパーリロード]]では [CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]] 付きの[[要求]]が[[生成]]されるのが普通です。通常の[[再読み込み]]でも
[CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]] が付されることもあります。

** IE における [CODE(HTML)@en[<meta http-equiv=Pragma content=no-cache>]]

[29] [[WinIE]] 3.02〜4.01 には、[CODE(HTML)[<[CODE(HTMLe)[meta]] [CODE(HTMLa)[http-equiv]]="pragma" [CODE(HTMLa)[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>

対策として、この文書では [CODE(HTMLe)[[[body]]]] 要素の後に2つめの
[CODE(HTMLe)[[[head]]]] 要素を置き、その中に [CODE(HTMLe)[meta]]
要素のタグを書けとものすごいことを言っています。例:
[PRE[
<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>
]PRE]

M$ は一体何を考えているのでしょう。英語の意味もついに分からなくなりましたか。

[30] [[WinIE4]] (4.01 SP2 まで) には、 [CODE(HTML)[<[CODE(HTMLe)[meta]] [CODE(HTMLa)[http-equiv]]="pragma" [CODE(HTMLa)[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 と [[WinIE5]] で [CODE(HTTP)[Pragma: no-cache]] (と HTML 形)
を処理してくれるのは over [[SSL]] の時だけだそうです。

仕様書に従うなら [CODE(HTTP)[Pragma: no-cache]] が使えるのは要求のときで応答のときは駄目なんだ、ほんとは、なーんて珍しくまともなことを言っています。

[32] [CITE@ja-JP[''''''[''''''HOWTO'''''']'''''' Internet Explorer でキャッシュを無効にする]]
( ([TIME[2014-09-23 13:01:18 +09:00]] 版))
<http://support.microsoft.com/kb/234067>

* 応答における [CODE(HTTP)@en[Pragma: no-cache]]

[33] [[HTTP]] [[RFC]] は[[応答]]における [CODE(HTTP)@en[[[Pragma:]] [[no-cache]]]]
は意味が定義されておらず、効果は当てにできないしています (>>27)。

[REFS[
- [36] [CITE[ブラウザキャッシュとレスポンスヘッダ - murankの日記]] ([TIME[2014-10-06 08:57:05 +09:00]] 版) <http://d.hatena.ne.jp/murank/20090714/1247828669>
]REFS]

[37] >>36 によれば[[応答]]の [CODE(HTTP)@en[[[Pragma:]] [[no-cache]]]]
に [[Firefox]]、[[Opera]]、[[Chrome]] が対応しているものの、 [[IE]]
は対応していないようです。対応している場合、 [CODE(HTTP)@en[[[Cache-Control:]]]]
[[ヘッダー]]の有無に関わらず、 [CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]]
と同じ効果を持つようです。

[34] 次のサイトは [CODE(HTTP)@en[[[Cache-Control:]] [[no-cache]]]] などと併用して
[CODE(HTTP)@en[[[Pragma:]] [[no-cache]]]] を[[応答]]に含めることで[[キャッシュ]]を無効化できると説明していますが、
他の解説サイト等の[[コピペ]]なのか実際に動作を確認したのかは不明です。

[REFS[
- [38] [CITE[キャッシュされないようにするには?]] ([TIME[2013-01-05 10:50:45 +09:00]] 版) <http://www.tohoho-web.com/wwwxx008.htm>
- [35] [CITE@ja[ブラウザ のキャッシュを制御する/no-cache]] ([TIME[2012-05-20 02:41:43 +09:00]] 版) <http://tech.bayashi.net/pdmemo/browsercache.html>
- [40] [CITE@en[PHP: header - Manual]] ([TIME[2014-10-03 10:18:46 +09:00]] 版) <http://php.net/manual/en/function.header.php>
- [39] [CITE@en-US[A Beginner's Guide to HTTP Cache Headers | Mobify]] ([[Mobify]] 著, [TIME[2014-10-04 17:06:17 +09:00]] 版) <http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/>
]REFS]

* 関連


[49] より強い拒絶には [CODE[no-store]] が使えます。

* 歴史

[45] [CITE@en[Fix #165: make it clearer "no-cache" revalidates · whatwg/fetch@7adae85]]
([TIME[2016-03-05 11:22:53 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/7adae85e7524a9cbff89d8ac39c7d4f01044edce>

[46] [CITE@en[567365 - Cache-Control no-cache on https page disables history]]
([TIME[2017-05-11 16:19:00 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=567365>

[FIG(quote)[
[FIGCAPTION[
[47] [CITE[http - Difference between no-cache and must-revalidate - Stack Overflow]]
([TIME[2017-06-27 13:02:30 +09:00]])
<https://stackoverflow.com/questions/18148884/difference-between-no-cache-and-must-revalidate>
]FIGCAPTION]

>  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.

]FIG]
