キャッシュ制御

Updated / Published

Internet Explorer, Firefox, Opera, Safari, Chromeなど主要ブラウザにはすべて一度読み込んだデータをハードディスクに蓄えておくことにより、次から高速にデータを表示することができるキャッシュ(cache)と呼ばれる機能を備えています。つまり、レンダリング速度を速めるために、一度ウェブサーバからダウンロードしたウェブページの内容等をハードディスク内に蓄えておくことで、次に同じページを表示するときにはウェブサーバ経由でデータをダウンロードするのではなく、ハードディスク内に蓄えておいたデータをそのまま表示します。

しかし、この機能は頻繁に更新(上書き)されるリソース(情報資源)においては、あまり好ましい働きではありません。このような場合に、ウェブサーバとUAの間で交わされるメッセージであるHTTPで、UAがデータをリクエストする際のメッセージをHTTPリクエストヘッダと言い、このリクエストに対してウェブサーバ側が返すメッセージをHTTPレスポンスヘッダと言い、このHTTPレスポンスヘッダに「特定のデータはキャッシュしないように」とUAへ通知することで、常に最新のリソースを参照させることが可能になります。

キャッシュしないように通知する設定

<Files ~ "\.(html|php|jpe?g|gif|png)$">
Header set Pragma no-cache
Header set Cache-Control no-cache
</Files>

まず、記述全体を囲んでいる Filesディレクティブは指定されているファイル名だけに、Filesディレクティブの中で定義されている他のディレクティブを適用させるように制限します。ここでは、拡張子に「html」,「php」,「jpg、または jpeg」,「gif」, 「png」をもつ5種類のファイルに対してのみ、Filesディレクティブの中で定義されている2行目と3行目の設定が反映されます。

そして、2行目と3行目にある Headerディレクティブが、UA のリクエスト(HTTPリクエストヘッダ)に対して返す HTTPレスポンスヘッダの置換、追加、削除を行うディレクティブです。そして、Headerディレクティブに続くオプション(属性)でその処理を決めます。setオプションであれば、ヘッダを設定し、同じ名前のヘッダが存在する場合はそれを置き換えます。

HTTPの仕様が厳密に決まったのは1996年のバージョン1.0からで、その後1999年に、HTTP1.0の機能を拡張したHTTP1.1(RFC2616)が公開されました。このため、UAによってそれぞれ対応しているHTTPのバージョンが異なる場合があります。ここで設定されている setオプションのヘッダは、まずPragmaヘッダが HTTP1.0 において汎用の HTTPヘッダとして定義されたもので、Pragmaヘッダに指定できる値は no-cache のみです。no-cache は文字通りキャッシュしないようにする指令です。そして、次に、Cache-ControlヘッダがHTTP1.1 においてキャッシュ制御する指示する専用に定義されているヘッダです。つまり、Pragmaヘッダが HTTP1.0準拠用、Cache-Controlヘッダが HTTP1.1準拠用の UA に対する設定です。アクセスしてくる UA の HTTPバージョンがわからない場合のために、サーバ側では両方のHTTPバージョンの設定を指定しておくことになります。

この設定により「html」,「php」,「jpg、または jpeg」,「gif」, 「png」をもつ5種類のファイルに限定して、UA に対してキャッシュしないように通知しています。これでデータを読み込む毎に常に最新のリソースを参照させることができます。

まとめと Headerディレクティブの構文

Header [ set | append | add ] ヘッダ名 "値"
Header [ unset | echo ] ヘッダ名

HTTPレスポンスヘッダの置換、追加、削除を行う Headerディレクティブには set, append, add, unset, echo の5つのオプション(属性)があり、それぞれ次のような処理を行います。

set
レスポンスヘッダを設定します。もし、同じ名前のヘッダが存在する場合は 置き換える。
append
レスポンスヘッダを既に存在する同じ名前のヘッダに追加します。新しい値が既存のヘッダに追加されるときには、既存のヘッダの後にコンマ(,)で区切られて追加されます。これはヘッダに複数の値を 指定するときの HTTP の標準的な方法です。
add
append と同義ですが、一般的には append の方を 使う方が良いとされます。
unset
指定されたレスポンスヘッダが存在すれば、削除する。同じヘッダ名が複数あれば、すべて削除する。値をつけてはいけない。
echo
指定された同じ名前のリクエストヘッダをレスポンスヘッダで返す。ヘッダ名に正規表現も使える。値をつけてはいけない。

これらオプションの後に続いて、ヘッダ名を指定します。ここで取り上げた設定例では setオプションに続いて、Pragmaヘッダと Cache-Controlヘッダを指定しました。このヘッダ名には最後にコロン(;)を含めることもできますが、あっても無くても構いません。

set, append, add, unset に続くヘッダ名は半角アルファベットの大文字・小文字が区別されません(case-insensitive)。つまり、Pragma と書いても、pragma と書いても同じです。ただし、echoオプションに続くヘッダ名は半角アルファベットの大文字・小文字を区別する(case-sensitive)ので厳密な指定が必要です。さらに echoオプションではヘッダ名に正規表現を使うこともできます。

set, append, add のオプションではヘッダ名に続いて、3つ目に値を指定します。もし、値に半角スペースを含む場合はダブルクォーテーション(")の引用符でくくる必要があります。ここで取り上げた、Pragmaヘッダと Cache-Controlヘッダに続いて、どちらも no-cache という値を指定しました。no-cache の値には半角スペースは含まれていないので、ダブルクォーテーション(")でくくる必要はありません。