読者です 読者をやめる 読者になる 読者になる

ヘッダを設定によるブラウザキャッシュ制御

サーバから送信されるHTMLヘッダを用いて、ブラウザがコンテンツをどのようにキャッシュするのか設定することができる。


Expires ヘッダー、もしくは Cache-Control ヘッダーのいずれか、Etag ヘッダー、Last-Modify のいずれかを設定するのがよい。*1

ヘッダー

Expires ヘッダー

HTTP 1.0 から存在し、キャッシュの期限切れを設定する。設定するときにはHTTP-date形式(IMF-fixdate, rfc850-date, asctime-date)で指定する。


例) Expires: Thu, 01 Dec 1994 16:00:00 GMT


HTTP-date 以外の指定がされると "already expired" とみなされて、キャッシュされない。
キャッシュされないために「-1」とかを指定することもある


指定できるのは1年以内の日付。

Cache-Controlヘッダー*2

HTTP/1.1 で追加されたヘッダー、Expire ヘッダーよりも優先する。

must-revalidate キャッシュが有効かどうか必ずサーバに問い合わせた上で利用する。問合せに成功しなければキャッシュは使用してなはならい
no-cache 一度キャッシュされたデータは有効であるかどうかをサーバに問合せをした上で利用する
no-store キャッシュをしない
public キャッシュ可能な全ての場合においてキャッシュに保存することができる
private 単一の利用者のために意図されているもので、共有キャッシュには格納されない。私用キャッシュには格納されて、使用される
max-age=n nは秒数で指定、n秒後キャッシュを更新する

上記の条件は複数指定することもできる

Cache-Control: private, no-store, no-cache, must-revalidate
Etagヘッダー

サーバでリソースに対する検証トークンを生成し、クライアントからのリクエストに返信する。

クライアントはキャッシュのEtagと比較し、変更がなければキャッシュのデータを利用する。

Last-Modifedヘッダー

HTML-date 形式の日付を使用して、リソースが最後に変更された日付を返す。 クライアントはキャッシュの日付と比較して変更を判断する。

設定方法

Apache+Expires

mdo_expires を有効にして、httpd.conf などに以下の様に記述する。

ExpiresActive On
ExpiresByType image/png "access plus 6 months"
ExpiresByType image/jpg "access plus 6 months"
ExpiresByType image/gif "access plus 6 months"
Cache-Control

同じようにhttpd.confで設定する


	Header set Cache-Control "public, max-age=86400"  #one day

もしくは mod_rewrite 使用する*3

RewriteEngine on

RewriteRule \.php$ - [L,E=X_CACHE_PATTERN1:]
RewriteRule \.html$ - [L,E=X_CACHE_PATTERN2:]
RewriteRule \.(css|js)$ - [L,E=X_CACHE_PATTERN3:]
RewriteRule \.(gif|jpe?g|png)$ - [L,E=X_CACHE_PATTERN4:]

# For dynamic contents
Header set Cache-Control "no-cache" env=X_CACHE_PATTERN1
Header unset Last-Modified env=X_CACHE_PATTERN1

# For HTML files
Header set Cache-Control "max-age=0" env=X_CACHE_PATTERN2

# For CSS,JavaScript files
Header set Cache-Control "max-age=600" env=X_CACHE_PATTERN3

# For Image files
Header set Cache-Control "max-age=86400" env=X_CACHE_PATTERN4
HTTP-dateについて*4
  • 曜日は英語の先頭3文字で必須、先頭のみ大文字
  • 日付は2桁
  • 月名は英語の先頭3文字で必須、先頭のみ大文字
  • 年は4桁
  • 秒の省略は不可
  • 時間帯はGMTのみ