CDNサーバにコンテンツがキャッシュされないことがあります。ここでは、原因と考えられる事項をまとめます。
CDNのデフォルト設定
HTMLファイル
CloudflareなどのCDNでは、キャッシュのデフォルト設定が以下のようになっています(変更が多いHTMLはキャッシュさせず、イメージのみをキャッシュさせるというポリシです):
- HTMLファイル:キャッシュしない
- イメージファイル:キャッシュする
検索文字列を含む
多くのCDNのデフォルト設定では、検索文字列(例:http://example.jp/index.html?page=1)を含むURLをキャッシュしません。
クッキーを含む
多くのCDNのデフォルト設定では、HTTPリクエストにクッキーが含まれれる場合、対象URLをキャッシュしません。
ETAGヘッダが設定されている
オリジンサーバがクラスタ化(複数台により構成)されており、ETAGヘッダが生成されている場合、ひとつのURLに対し複数のETAG値が存在することになります。そして、この場合、キャッシュは正常に稼動しません。この修正には、オリジンサーバでETAGヘッダを生成させないようにする必要があります。
Apacheでの設定は以下になります:
- FileETag None
PragmaおよびCache-Controlヘッダの設定ミス
オリジンサーバが以下のようなHTTPヘッダを生成する場合、CDNはオブジェクトをキャッシュしません。
オリジンサーバのレスポンスに以下のHTTPヘッダが含まれている場合
- Cache-Control
- no-store, private
- Pragma
- No-cache
もしくは、以下のHTTPヘッダが不適切に設定されている場合、
- Cache-Control
- max-age
- キャッシュの生存時間(秒)。これが0だとキャッシュされない
- max-age
- Expires
- キャッシュの有効時刻。この時刻が、現在の時刻の前だとキャッシュされない
これを修正するには、以下の3種類の方法があります:
CMSによるHTTPヘッダ生成の抑制
WordPressなどのCMSでは、生成したブログページに対しNo-cacheを強制的に挿入することがあります。これの抑制はCMSにより異なります:
- WordPress
- functions.phpに以下のような定義を追加する
- add_filter( ‘nocache_headers’, ‘custom_nocache_headers’ );
- function custom_nocache_headers( $headers ) {
- unset( $headers[‘Expires’]);
- unset( $headers[‘Cache-Control’]);
- unset( $headers[‘Pragma’]);
- return $headers;
- }
- functions.phpに以下のような定義を追加する
WebサーバによるHTTPヘッダの強制書き換え、強制削除
CMS等によっては、no-cacheの生成を抑制できない場合があります。この場合も、Webサーバにno-cacheを削除させる設定を行うことができます:
- Apache
- mod_headersを使用しCache-Controlを削除することができます。設定は以下のようになります:
- Requestheader unset Cache-Control
- mod_headersを使用しCache-Controlを削除することができます。設定は以下のようになります:
CDNにおけるオリジンHTTPヘッダの無視
オリジンサーバのHTTPヘッダを無視できるCDNもあります。
HTTPヘッダの不足
CDNがオブジェクトをキャッシュするには、以下のHTTPヘッダが生成されている必要があります:
- Last-Modified
- Expires
- Content-Length
基本的な対策としては、オリジンサーバ側で前記HTTPヘッダを生成することですが、CDN側のTTL設定によりキャッシュさせることも可能です。ただし、Last-Modified等がない場合、ブラウザキャッシュでもキャッシュされない可能性があるため、FEO的には、きちんとオリジンサーバで修正すべきです。
ファイルが大きすぎる
CDNには、キャッシュできる最大サイズが設定されています。これを超えるファイルはキャッシュされません。
クライアントがレンジリクエストを発行している
レンジリクエストを含むリクエストは、CDNによりキャッシュできないことがあります。詳細についてはレンジリクエストを参照ください。