[Apache] キャッシュ期限を指定する mod_expires

Webブラウザなどで何度も同じサイトにアクセスした際に、その都度変化する情報もあれば、全く更新されない情報もあります。前回と同じ情報であればブラウザ内部に一時的に保存し再利用してもらった方がサーバもクライアントもお互いに仕事が減って助かります。

今回はApacheのmod_expireモジュールを利用しクライアントに指定した期間、キャッシュさせてみます。

ブラウザにキャッシュさせる

Webサーバからブラウザへのレスポンス内容に、特定のHTTPヘッダを付けることによってキャッシュさせることができます。

このヘッダにはExpiresCache-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ブラウザやクライアントが忠実に守るとは限りません。あくまでサーバ側からの意思表示であると考えておいた方が良いです。

参考ページ