Base kernel Logo(4,742bytes) Electronics branch Logo(5,335bytes)

技術屋の間違った常識

このページを設けるきっかけ

 日々仕事なり、生活なりしていく中で、今まで信用していたものや知識として得ていたものがある日突然、「間違いだった」「嘘だった」というたぐいのことに出くわす経験は結構ある話でしょう。

 このサイトに掲載している内容の間違いをいくつか指摘されたことが数年前にあり、「これではまずい」ということでこういうページを作ろうと思いつつ、数年が経過してしまいました・・・

ここはそういう小ネタ(?)を寄せ集めるページです
 電子回路・無線系・ICT系に特化した内容になります。

〔ICT 系〕Webブラウザのキャッシュコントロール (2015/01/11)

 Webブラウザにキャッシュをさせたくないページを作成する場合、安直に
 <meta http-equiv="pragma" content="no-cache">
 という、呪文のようなタグ1行を <head> ~ </head> の間に書いている制作者は多い。

 だが、環境によっては、上手く行かないというか、意図したとおりになってくれないわけです。
 Webサーバのせいにする人もまれにいますが、それは間違い。弊社としてもそれは迷惑。

 では、何故か?
 『Webブラウザの種類によって、キャッシュ制御挙動が違う』
 『キャッシュ制御タグの使い方が間違っている』
 『キャッシュ制御タグは制作側の要望であって、実際の挙動は必ずしも要望に沿わない』
 という、3つの無知に集約されるのです。

 Webブラウザは、マイクロソフト社謹製の Internet Explorer 以外にも、Firefox,Chrome,Opera,Sleipnir,... など多種多様なものが世の中には出回っています。
 キャッシュ制御の挙動はそれぞれのWebブラウザで異なります。異なって欲しくないですが、現実は「異なっている」のです。
 <meta> タグは、HTTP ヘッダを補完したり、ページ自体の属性を設定したりするためのものですから、どのWebブラウザでも同じ扱いを強制すべきだと考えます。

 結論を先に示しますが、制作側が出来る目いっぱいの「キャッシュ禁止の主張」は、
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="expires" content="0">
 <meta http-equiv="cache-control" content="no-cache, no-store">

 の3行全てを、<head> ~ </head> の間に書くのです。
 ブラウザの挙動の違いまで、制作側では事細かに理解しきれません。

 これでも、意図通りにキャッシュ禁止が出来る保証がありません。
 制作側で出来ることは、あくまでも「Webブラウザに対する要望」なのです。
 特に高速動作を謳う Chrome は、高速表示をするためにキャッシュを多用します。キャッシュを禁止してもキャッシュしてしまう場合が多いことが知られています。

 最後に、上記の3行がどういう意味か、をコメントしてみましょう。
 ・ <meta http-equiv="pragma" content="no-cache">
 pragma というのは、古い実装で、キャッシュ関係でとり得る値は no-cache しかありません。
 この1行で、昔は「キャッシュを禁止せよ」とお願いできたわけです。
 しかし、その実装の古さ故に、このタグは将来のWebブラウザバージョンアップで無視されるようになる可能性があります。
 具体的には HTTP/1.0 の仕様で、現在は殆どが HTTP/1.1 の仕様で動作しているため、消える可能性がある、と言う話です。

 ・ <meta http-equiv="expires" content="0">
 expires というのは、指定時間後や日時にキャッシュを捨てるという意味で、とり得る値は「秒」または、一定の書式の日付です。
 ここに0を指定することで、「0秒後」すなわち、読み込み完了したらすぐキャッシュを捨てるということになります。

 ・ <meta http-equiv="cache-control" content="no-cache, no-store">
 最近の実装は、これです。pragma に代わるものでしょうか。
 とり得る値は、4つあり、no-cache,no-store,private,must-revalidate があります。

no-cache いかにも「キャッシュするな」といわんばかりだが、そうではなく、一度キャッシュしたページをWebブラウザの表示で再利用する場合、Webサーバへ内容が変わっていないことを確認しない限りは「キャッシュの内容を再利用するな」、という意味になる。
no-store これこそが「キャッシュするな」という意味になる。
private キャッシュをする場合に、複数ユーザが同じWebブラウザを使うような環境において、キャッシュを共有すべきではないという意味になる。
must-revalidate  一度キャッシュしたページをWebブラウザの表示で再利用する場合、Webサーバへキャッシュが有効期限内かどうか、必ず確認しろ、という意味になる。

 ということで、no-cache と no-store を指定しておけば、Webブラウザが要望に沿ってくれた挙動をしてくれるならば、「キャッシュするな」「キャッシュを使うな」が出来るはずです。


トップページに戻る
days:0001 yesterday:0001 Total:001319