httpサーバを運用する場合、ファイルの拡張子別にキャッシュ期間をコントロールする方法がよく用いられますが、今回の案件ではディレクトリ毎にキャッシュを調整したいので、その方法を調べてみました。
現在稼働中のサーバは、Dockerで運用されていまして、php:7-apacheをベースにしたコンテナが走っています。
Apacheの場合、.htaccessを使うことで、ディレクトリ別に設定を変更できますが、キャッシュについても設定できるようです。
まずは、サーバから出力されている画像のヘッダを確認してみました。
cache-control: max-age=31536000
expires: Tue, 01 Dec 2020 06:13:40 GMT
わお、ブラウザに1年もキャッシュされる設定になっていました。
一概にこれが長いとは言えませんが、今回の案件においては、長すぎますので、これを1日に変更していきます。
ブラウザキャッシュを1日に設定したいディレクトリに .haccsess を置き、以下のように記述します。
Header set Cache-Control "max-age=86400"
Header unset Expires
Header unset ETag
ブラウザに向けたキャッシュの指定方法として、Cache-ControlヘッダとExpireヘッダがありますが、両方設定されていた場合、Cache-Controlの指定が優先されます。
これまでは、一部のブラウザはCache-Controlをサポートしていないので、両方設定しておきましょうと言われていましたが、さすがにもうExpireは必要ないと思われます。そのようなブラウザは、現在のSSL通信に対応できていないので、 サイトへのアクセスが そもそも 出来ないためです。
Cache-ControlとExipireでキャッシュ期間の不整合があると気持ち悪いので、Expireヘッダーは削除してしまいましょう。
さらに、 サーバを複数台で構成した場合に備えて Etagも削除しておきます。Etagはファイルのバージョンをチェックして、更新されていれば再読み込みをするという仕組みなのですが、複数台構成にすると、例え同じファイルであっても異なるEtagを送出して、無駄な再読み込みが発生してしまうためです。
これでOK!と意気込んでテストするも、無常の Internal Server Error!
あらら、「mod_headers」が無効になっているのかしら。
というわけで、Dockerfileを以下のように書き換えます。
FROM php:7-apache
...
(略)
...
# これを追記
# Apache2 mod headers
RUN mv /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
「headers.load」を「mods-available」ディレクトリから「mods-enabled」ディレクトリに移動して有効化してやります。
ビルドし直したイメージでコンテナを立ち上げたら、ブラウザで再度同じ画像を読み込んでみます。
cache-control: max-age=86400
OK! 無事キャッシュ期間が1日になり、Expireヘッダも消えました。
お疲れ様でした!
ホームページの制作(デザイン・コーディング・プログラミング)に加え、ネットショップの販売促進に関するアドバイスも致します。 20年以上に渡って実際にネットショップを運営した経験を生かし、聞きかじりではない実績を伴ったノウハウを、自分の言葉でお伝えいたします。 プログラミングの経験は30年以上。HTML、CSS、JavaScript、TypeScript、Vue、NuxtJS、Node.js、MySQL、MongoDB、Elasticsearch、WordPress、PHP、Docker、Electronなど、幅広く対応します。
コメント