ブラウザのキャッシュを抑制にする方法

ブラウザのキャッシュは表示の高速化に大変有効ですのでメリットのほうが多いですが、最新の情報が反映されなかったり、タイムラグがあったりする問題もあります。

 

<meta http-equiv=”Pragma” content=”no-cache”>
<meta http-equiv=”cache-control” content=”no-cache”>
<meta http-equiv=”expires” content=”0″>

HTMLページの場合は <head>~</head> の間に以下の3行を書きます。 <meta http-equiv=”Pragma” content=”no-cache”>
<meta http-equiv=”Cache-Control” content=”no-cache”>
<meta http-equiv=”Expires” content=”Thu, 01 Dec 1994 16:00:00 GMT”>
Perl/CGIの場合は HTTPヘッダで以下のような出力をします。 print “Content-type: text/html\n”;
print “Pragma: no-cache\n”;
print “Cache-Control: no-cache\n”;
print “Expires: Thu, 01 Dec 1994 16:00:00 GMT\n\n”;

PHP/CGIの場合は Perlと同じくHTTPヘッダに以下のような出力をします。 header(“Content-Type: text/html; charset=文字コード”);
header(“Expires: Thu, 01 Dec 1994 16:00:00 GMT”);
header(“Last-Modified: “. gmdate(“D, d M Y H:i:s”). ” GMT”);
header(“Cache-Control: no-cache, must-revalidate”);
header(“Cache-Control: post-check=0, pre-check=0”, false);
header(“Pragma: no-cache”);

ワードやエクセルファイルなどの場合は サーバの設定を変更して、HTTPヘッダを追加します。
サーバが Apache の場合は、httpd.conf で以下の設定を加えます。 <Files ~ “\.(doc|xls)$”>
Header set Pragma no-cache
Header set Cache-Control no-cache
Header set Expires “Thu, 01 Dec 1994 16:00:00 GMT”
</Files>

WWWブラウザはコンテンツをキャッシュする機能を備えています。無駄なトラフィックを削減するための機能ですが,業務システムでは不都合が生じる場合があります。古い情報を表示してしまうケースや,給与明細のように重要な情報を扱うシステムではキャッシュにコンテンツが残るとセキュリティ上の問題も出てきます。

この問題を回避する最も簡単な方法は,WWWブラウザの設定でキャッシュを無効にすることです。例えば,Internet Explorer(IE)やNetscape Communicator(NC)の場合はキャッシュのサイズを0に設定すれば,リクエストの都度サーバーにアクセスします。ただこの場合,すべてのコンテンツがキャッシュされなくなってしまいます。また,すべてのクライアントのWWWブラウザの設定を変更するのは手間がかかる,という課題もあります。

サーバー設定でキャッシュを禁止

図1●HTTPにおけるキャッシュの仕組み
WWWサーバー側でキャッシュの禁止を設定すれば,WWWブラウザはコンテンツをキャッシュせず,その都度アクセスする。WWWサーバー側でキャッシュの有効期限を指定した場合は,有効期限内であればキャッシュを利用し,有効期限を過ぎていればコンテンツの更新の有無を確認する,という仕組みである
各クライアントごとの設定が難しい場合は,WWWサーバー側の設定でキャッシュを禁止することも可能です。HTTPが備えるキャッシュの仕組みを利用します(図1[拡大表示])。HTTPではPragma(HTTP 1.0以降)やCache-Control(HTTP 1.1)といったキャッシュの扱いを指示できるヘッダーがあります。これらのヘッダーにno-cacheなどを指定すれば,コンテンツはその都度アクセスされるようになります。

セキュリティ上の問題が無ければ,コンテンツの有効期限を指定する方法も効果的です。Expires(HTTP 1.0以降)やCache-Controlヘッダーを使ってコンテンツの有効期限を指定できます。Expiresは「Sat,1 Sep 2001 12:00:00 GMT」といった形式,Cache-Controlは「max-age=[有効期限が切れるまでの秒数]」という形式でコンテンツの有効期限を指定します。有効期限が切れるまではキャッシュを利用しますが,切れた場合はコンテンツが更新されたかどうかをIf-Modified-Since(IMS)リクエストで確認します。WWWサーバーはIMSリクエストを受け取ると,コンテンツが更新されている場合は更新したコンテンツを返し,更新されていない場合はキャッシュが有効である旨を返します。

キャッシュの禁止や有効期限の指定などはHTMLの<meta>タグで設定することも可能です。「<meta http-equiv=”HTTPヘッダー名” content=”指定する値”>」のように記述します。例えば,「<meta http-equiv=”Pragma” content=”no-cache”>,<meta http-equiv=”Expires” content=”Sat,1 Sep 2001 12:00:00 GMT”>」といった形です。

ただ,<meta>タグはWWWブラウザで判別されるもので,基本的にプロキシ・サーバーに対しては無効です。プロキシ・サーバー経由でアクセスしている場合は,WWWブラウザのキャッシュを利用しないようにできても,プロキシ・サーバーのキャッシュを見てしまう可能性があります。HTTPヘッダーに直接指定すればキャッシュ・サーバーとWWWブラウザの両方に対して有効になります。

ブラウザによっては機能しない
HTTPヘッダーは,HTMLコンテンツではWWWサーバー側で設定,CGI(Common Gateway Interface)アプリケーションではプログラム内で設定します。

まずWWWサーバーの場合,Internet Information ServerはHTTPヘッダーを追加したいコンテンツの[プロパティ]-[HTTPヘッダー]タブの画面で「カスタム HTTP ヘッダー」の追加,Apacheではmod_headersのモジュールを追加して設定ファイルhttpd.confの内容を変更すれば任意のHTTPヘッダーを追加できるようになります。

表1●WWWブラウザにおけるキャッシュの扱い方の例
一方,CGIアプリケーションの場合はWWWサーバーへの出力の冒頭部分で任意のHTTPヘッダーを追加できるほか,ASP(Active Server Pages)であれば「<% Response.CacheControl = “no-cache” %>,<% Response.AddHe-ader “pragma”, “no-cache” %>」などをプログラム内に記述します。

なお,WWWブラウザの種類やバージョンによっては上記の仕組みがうまく動作しないこともあります。例えば,IE 5.5(SP1)とNC 4.73で動作を確認したところ,表1[拡大表示]のようになりました。基本的にはHTTPヘッダーでPragmaとCache-Controlの両方を指定した方が良いでしょう。