Webブラウザなどで何度も同じサイトにアクセスした際に、その都度変化する情報もあれば、全く更新されない情報もあります。前回と同じ情報であればブラウザ内部に一時的に保存し再利用してもらった方がサーバもクライアントもお互いに仕事が減って助かります。
今回はApacheのmod_expireモジュールを利用しクライアントに指定した期間、キャッシュさせてみます。
ブラウザにキャッシュさせる
Webサーバからブラウザへのレスポンス内容に、特定のHTTPヘッダを付けることによってキャッシュさせることができます。
このヘッダにはExpires
とCache-Control
の2種類がありますが、効果としては同じです。
Expires
の方が歴史が古いためほとんどのクライアント(ブラウザ)が対応していますが有効期限を指定することしかできません。Cache-Control
ではより細かい制御が可能です。
Expiresヘッダ
キャッシュの有効期限を指定します。以下では2020年3月30日まで同じ情報を利用してもOKという意思表示になります。
Expires: Mon, 30 Mar 2020 00:26:17 GMT
なお、過去の日付を指定すると「キャッシュするな(すでに有効期限が切れているので次回もリクエストしてね)」という意思表示になります。
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Controlヘッダ
キャッシュの有効期限を秒数で指定します。以下の場合は1日(60秒 * 60分 * 24時間=86400秒)キャッシュせよという意味になります。
Cache-Control: max-age=86400
またCache-Control
ヘッダではmax-age
の指定と同時に同時に次のような設定を行うことができます。
指定 | 説明 |
---|---|
public | リクエストした本人以外も利用可能な情報、途中の経路(CDNなど)でキャッシュして良い ※通常は未指定 |
private | リクエストした本人のみが利用する情報、途中の経路(CDNなど)でキャッシュしてはならない |
書き方は以下の通り。カンマで区切ります。
Cache-Control: private, max-age=86400
キャッシュをさせない指定も可能です。
指定 | 説明 |
---|---|
no-cache | サーバに更新されたかを都度確認し、更新されていなければキャッシュを使用して良い |
no-store | 一切のキャッシュをしてはならない |
Cache-Control: no-store
Apacheで設定する
モジュールのロード
mod_expiresモジュールを利用しますので、ロードされているか確認をします。
$ grep 'mod_expires' /etc/httpd/conf.modules.d/00-base.conf LoadModule expires_module modules/mod_expires.so
※設定されているファイルは環境によって異なります(/etc/httpd/conf/httpd.conf
など)
mod_expiresの利用方法
利用方法はいたって簡単。以下の指定で現在時間から1年間キャッシュさせるヘッダを生成してくれます。これを
や
などのディレクディプ内に書いてやるだけです。
ExpiresActive On ExpiresDefault "access plus 1 year"
access
の他に、modification
を指定するとファイルの最終更新日を起点とすることができます。
また時間の指定方法には以下のキーワードが利用できます。
- years
- months
- weeks
- days
- hours
- minutes
- seconds
なおplus
は省略可能です。
特定のファイルに指定
拡張子が.html
のファイルの場合1年間キャッシュさせます。
<ifModule mod_expires.c> ExpiresActive On <FilesMatch ".html$"> ExpiresDefault "access plus 1 year" </FilesMatch> </ifModule>
特定のファイル形式に一括指定
ファイル名や拡張子ではなく、指定したContent-typeによってキャッシュを行います。
<ifModule mod_expires.c> ExpiresActive On ExpiresByType image/png "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/gif "access plus 1 year" </ifModule>
注意
これらの指定を必ずしもWebブラウザやクライアントが忠実に守るとは限りません。あくまでサーバ側からの意思表示であると考えておいた方が良いです。