Apache httpd の mod_expires でキャッシュ有効期限を設定しよう

投稿者 : OSCA

関東地方の美しい夜景を観にいこう。 夜景サイト「夜景散歩」で夜景スポットを検索

 HTTPレスポンスヘッダの項目に、HTTPクライアントにコンテンツのキャッシュ有効期限を返却するためのHTTPレスポンスヘッダ「Expires」と「Cache-Control」があります。 本稿では、これらのヘッダを返却する機能を提供する Apache モジュール「mod_expires」について、概要・使い方を解説します。

Expiresヘッダの目的

 mod_expires の説明をする前に、まずは Expires ヘッダの目的について振り返ってみましょう。 HTTPレスポンスヘッダ「Expires」は、HTTPクライアントにキャッシュの有効期限を返却するためのヘッダです。 HTTPクライアントがWEBサイトを再訪した場合に、以前に訪れた際のキャッシュを使ってもらうことで無駄なHTTPアクセスを減らし、WEBページの表示を高速化することが目的です。 そのためにキャッシュの有効期限を返却します。

要点

  • キャッシュ有効期限内はキャッシュを利用するため、高速にコンテンツを表示できる。
  • キャッシュを利用するため、無駄なインターネット通信を削減できる。
  • サーバーは無駄なリクエストを受けずに済むため、サーバー負荷を削減できる。

 Expires ヘッダについてもっと詳しく知りたい方は「HTTPレスポンスヘッダ Expires とは?」を参考にしてください。

mod_expires とは?

 Apache httpd で Expires ヘッダを返却するためのモジュールとして mod_expires があります。 mod_expires は、どんなディストリビューションのものでも最初から有効になっていると思います。 mod_expires が有効になっているかは、ご利用の Apache httpd の設定ファイルの LoadModule の記述を確認してください。 次のように expires_module の記述がコメントされていないことを確認します。 (設定を変更した場合は再起動を忘れずに)

LoadModule expires_module modules/mod_expires.so

 ただしモジュールが有効になっていたとしても、設定を記述しないと Expires ヘッダは返却されません。

mod_expires の設定

 それでは設定方法について解説していきます。 そもそも Expires を付与するのに適したコンテンツは、画像ファイルなどの頻繁に更新されない静的コンテンツです。 ここでは画像ファイルに Expires ヘッダを付与する設定を例に解説します。

 mod_expires が提供する設定記述子は次の3つ、「ExpiresActive」「ExpiresByType」「ExpiresDefault」だけです。

記述子説明
ExpiresActive Expires と Cache-Control ヘッダの返却を有効にするか無効にするかを決める記述子です。
ExpiresByType コンテンツの形式毎に有効期限を指定するための記述子です。
ExpiresDefault 全てのコンテンツに有効期限を指定するための記述子です。

 これら3つの記述子を組み合わせて、Expires ヘッダが返却されるように設定します。

設定記述例(1) ファイル形式指定で Expires を設定する

 最小の記述は次のようになります。

<ifModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/png "access plus 1 month"
</ifModule>

 タグ <ifModule mod_expires.c> で、mod_expires モジュールが有効である場合にのみ、タグの中が実行されるようにします。 そして ExpiresActive On の記述で mod_expires を機能を有効化しています。 次の ExpiresByType では、PNG形式の画像ファイル (image/png) にアクセスされた場合に、アクセスして1ヶ月間キャッシュするように Expires ヘッダを返却するように指定しています。

設定記述例(2) ファイル名指定で Expires を設定する

 ファイル形式ではなく、ファイル名を指定して Expires ヘッダを返却したい場合は <FilesMatch …>ExpiresDefault を組み合わせて指定すると便利です。

<ifModule mod_expires.c>
  ExpiresActive On
  <FilesMatch "^(icon-).+$">
    ExpiresDefault "access plus 1 month"
  </FilesMatch>
</ifModule>

 上の例では icon- で始まる名前のファイルにアクセスされた場合に、ファイル形式に捉われずに Expires ヘッダを返却するように設定しています。

キャッシュ期間の表現

 上記の例ではキャッシュ有効期限を access plus 1 month と指定しましたが、次のような書式で様々な指定ができます。

access plus 期間
now plus 期間
modification plus 期間

 accessnow は、アクセス時間をもとにキャッシュ有効期限を指定する場合の表記です。 access も now もどちらも意味は同等です。 「アクセスした時から1週間キャッシュしろ」のような指定をすることができます。 一方 modification は、ファイルの更新日時を起点として有効期限を指定する場合に利用します。

 期間の指定には次のキーワードを指定できます。

キーワード説明
year(s)
month(s)
week(s)
day(s)
hour(s)
minute(s)
second(s)

これらを組み合わせて、次のようなキャッシュ期間の指定ができます。

  • access plus 1 month
  • access plus 3 months
  • access plus 1 year
  • access plus 1 month 15 days 2 hours

設定における注意点

 最後に Expires の設定における注意点について解説します。

 まずは、繰り返しになりますが、動的コンテンツに Expires を設定しないことです。 アクセスするたびに変化するような性質のコンテンツに Expires を設定してしまうと、利用者には更新されたコンテンツが表示されなくなってしまいます。 静的コンテンツにのみ Expires が返却されるように設定するように注意してください。

 また、キャッシュ有効期限にも注意が必要です。 1週間〜1年の期間を設定することが望ましいとされていますが、1年を超える設定はPRCのガイドラインに反する点は注意が必要です。

おわりに

 本稿では Expires ヘッダを返却する mod_expires について解説しました。 WEBページの高速化、HTTPサーバーの負荷軽減の対策の一つとしてぜひ取り入れてみてください。

Apache httpd 入門へ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。
個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca