CloudFront FunctionsでWordPressのプレビューが更新されるようにする

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に紐付けすることで、キャッシュヒットの判断をする前にクエリストリングを更新でき、キャッシュヒットしなくなります。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-cloudfront-trigger-events.html

まとめ

本記事では、WordPressとCloudFrontを組み合わせて使う時に、プレビューページがキャッシュされて、更新されなくなってしまう問題への対処法を紹介しました。

CloudFront Functionsを上手く使うことで低額なコストでCloudFrontの挙動を変更することができるため、比較的シンプルなCDNであるCloudFrontをフル活用するために積極的に利用することをお勧めしています。

その他のCloudFront Functionsの利用方法もコード付きで解説していますので、興味があれば読んでみてください。

あわせて読みたい
CloudFront Functionsでブラウザキャッシュの挙動を制御する 本記事では、CloudFront Functionsを使って、ブラウザキャッシュの挙動を制御する方法をお伝えします。通常のCloudFrontのキャッシュに加えて、ブラウザキャッシュの制...
あわせて読みたい
CloudFront FunctionsでZoneApexをwwwにリダイレクトする 本記事では、CloudFront Functionsを使って、ZoneApexをwwwにリダイレクトする方法をコード付きでお伝えします。 ZoneApexやCloudFront Functionsについても補足します...
よかったらシェアしてね!

CD

目次