【しばらく編集不可モードで運営します】 編集(管理者用) | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴

CGIでのキャッシュ管理 - 元はKakeraの話題ですが、長文なのでYukiWikiに。

元はKakeraの話題ですが、長文なのでYukiWikiに。

RFC的には、HTTP1.1で下位互換として規定されているPragmaヘッダではなく、 ExpiresヘッダやCache-Controlヘッダを使用するべきなのだそうです。

Operaの設計思想上、RFCへの準拠の度合いはIEよりも高いと思われます。 従って、HTTP1.1>HTTP1.0との下位互換という当然の優先度により、 Cache-Control優先、Pragma無視、という結果になっているという可能性は 十分に有り得ます。


実際、キャッシュの扱いはあらゆるCGI開発者にとって頭の痛い問題です。

まず、ブラウザの独自仕様が問題になります。 一例を挙げますと、IE4.xではHTTPヘッダ内のあらゆるキャッシュ指定を無視し、 HTMLヘッダ内でのPragmaの宣言だけを認識するようです。

また、CGIが考慮しなければならない相手はブラウザだけではありません。 プロキシサーバもキャッシュを行います。

残念ながら、HTTP1.1に対応していない、または、対応を謳ってはいるが 完璧には対応していないプロキシサーバが現実に存在します。 これは本来はプロキシサーバの管理者の問題ですが、 利用者のユーザビリティを最大限考慮するのであれば、 HTTP1.0でのキャッシュ指定とHTTP1.1のキャッシュ指定を併用してやる必要があります。

理想的なキャッシュ無効化の指定は以下の通りです。

 #HTTPレスポンスヘッダ
 Expires: Sun, 10 Jan 1990 01:01:01 GMT
 Cache-Control: no-cache
 Pragma: no-cache
 
 #HTMLのheadタグ内の先頭部
 <meta http-equiv="Expires" content="Sun, 10 Jan 1990 01:01:01 GMT" />
 <meta http-equiv="Cache-Control" content="no-cache" />
 <meta http-equiv="Pragma" content="no-cache" />

ここまで、キャッシュを可能な限り無効化するための方法を書いてきました。 キャッシュ指定を行う場合の問題は、キャッシュ管理が行き過ぎてしまう可能性があることです。 例えば、ブラウザの実装によっては、戻るボタンをクリックした場合にも 自動的にリロードが行われてしまうかもしれません。 結果として、低速回線を利用しているユーザや 従量制の課金が行われる回線を利用しているユーザーは、 CGI製作者を少しだけ恨むかもしれません。

しかし、それにも増して最悪なのは、「リロードされない」というバグです。 CGI開発者はHTTP1.1のキャッシュ管理指定の貧弱さとブラウザの独自仕様の狭間で、 しばらくは悩み続けることになるでしょう。