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

  • このエントリーをはてなブックマークに追加
  • LINEで送る

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

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

- Sponsored Link -

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

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年間キャッシュさせるヘッダを生成してくれます。これを<Directory><Files>などのディレクディプ内に書いてやるだけです。

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

参考ページ

- Sponsored Link -

同じカテゴリの記事

Donate

投げ銭お待ちしております!

BTC3A9nH1j7qQdKrSTrmnEdweo6zPqpHBmkxC
ETH0x1aE0541198D1F9f2908a25C35032A473e74D3731
XPXaQ9zv65F9ovfoMBrFGiPRG47aSHFhy8SX
MONAMTKgzSiS5BDueZkRCHySih24TGFwHThaDQ (MonaCoin)
ZNYZhnpf4RFYVQTAQiyoJg9dGoeC4bgT3BoSy (BitZeny)

ご質問やリクエストなどお気軽に。メールアドレスの入力は任意です。書き込みが反映されるまで時間がかかります。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください