Amazon CloudFrontでWordPressサイトをキャッシュすることでページ表示速度の高速化とサーバー負荷の削減ができるメリットがあります。
一方で、AWSのガイドに従い、WordPressサイトの管理者用ページをキャッシュしない設定にした場合でも、記事のプレビュー画面はキャッシュされ、更新されない課題があります。この挙動は、下書き状態で記事の見た目を確認できなくなるため、サイトの運営上問題となってしまいます。
本記事では、CloudFront Functionsを用いて、WordPressのプレビュー表示が正常に行えるようにする方法を紹介します。
なぜWordPressのプレビューがキャッシュされてしまうのか?
まずは、WordPressのプレビュー画面がキャッシュされてしまう理由を解説します。
端的にお伝えすると、WordPressのプレビューのURLが次のURLのように通常のURLにクエリストリング&preview=true
を付与しただけの形になるからです。
https://www.bloomblock.net/?p=2611&preview=true
CloudFrontは、キャッシュポリシーをパス単位でしか指定できず、クエリストリングによって処理を分けることができません。そのため、プレビュー画面も投稿済みのページと同様にキャッシュ対象に含まれ、更新されなくなります。
そのため、&preview=true
がクエリストリングに含まれていた場合に、追加のクエリパラメータを追加してキャッシュにヒットしなくなる処理をCloudFront Functionsで追加します。
CloudFront Functionsのコード
それでは、実際に利用するコードを見ていきましょう。
&preview=true
がリクエストのクエリストリングに含まれている場合、nonce
というパラメータを追加しています。nonce
には、new Date().getTime()
を代入し、常に現在時刻をUnixtimeで表した値が入るようにしています。
function handler(event) {
const request = event.request;
const queryString = request.querystring;
// クエリストリングに preview=true が含まれているかチェック
if (
queryString.hasOwnProperty("preview") &&
queryString["preview"].value === "true"
) {
const currentTime = new Date().getTime();
// nonce=<current time> をクエリストリングに追加
queryString["nonce"] = { value: currentTime.toString() };
}
// 更新されたクエリストリングをリクエストに設定
request.querystring = queryString;
// 変更されたリクエストを返す
return request;
}
リクエストする度に現在時刻がクエリストリングに含まれるため、キャッシュヒットしなくなり、常に最新のプレビューが表示されるようになります。
CloudFront Functionsのコードの紐付け
上記のCloudFront FunctionsのコードをCloudFrontのデフォルトビヘイビアのViewer Requestに紐付けします。
Viewer Requestに紐付けすることで、キャッシュヒットの判断をする前にクエリストリングを更新でき、キャッシュヒットしなくなります。
まとめ
本記事では、WordPressとCloudFrontを組み合わせて使う時に、プレビューページがキャッシュされて、更新されなくなってしまう問題への対処法を紹介しました。
CloudFront Functionsを上手く使うことで低額なコストでCloudFrontの挙動を変更することができるため、比較的シンプルなCDNであるCloudFrontをフル活用するために積極的に利用することをお勧めしています。
その他のCloudFront Functionsの利用方法もコード付きで解説していますので、興味があれば読んでみてください。