キャッシュ制御
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
の値には半角スペースは含まれていないので、ダブルクォーテーション("
)でくくる必要はありません。