特定のリクエストをキャッシュ対象外に設定する


この記事では特定のパスに対するリクエストなどをFastlyサーバー上でキャッシュさせない設定の作成手順について説明します。

特に記載がない限り本記事の記載内容はデフォルト設定での挙動となります。
なお、この記事ではリクエストに対してPASSする手順を説明しています。Fastlyサーバーがオリジンサーバーからレスポンスを受け取って初めて分かる条件でPASSをしたい場合は異なる手順となります。
このあたりの詳細は「PASSアクションの挙動について(
https://docs.fastly.com/ja/guides/vcl/understanding-the-different-pass-action-behaviors)を参照して下さい。

作業の流れとしてはまずPASS(キャッシュをしない)するRequest Settingというものを作成し、作成したRequest Settingに対してCondition(条件)を付与します。

Request Settingを作成する

  1. FastlyのWebポータルにログインしConfigureをクリックします。
  2. Serviceメニューから設定を行いたいServiceを選択して下さい。
  3. 対象のVersionがLockedのステータスの場合は、右上のOptionメニューからCloneをクリックして下さい。表示中のVersionを元にした新しい編集可能なVersionが作成されます。
  4. Settingタブをクリックして下さい。以下のような画面が表示されます。

  5. Create Request setting をクリックして下さい。"Create a new request setting"ページが表示されます

  6. Create a new request settingに以下の値を入力して下さい

    • Action : Pass(do not cache)
    • Force TLS: Not Selected
    • X-Forwarded-For: X-Forwarded-Forヘッダーを設定するかどうかを指定します。通常はAppendで問題ありません。
    • Description: この設定を識別するための何か適当な名前を入力して下さい。

その他のAdvance Optionは通常は変更する必要はありません。

Request Settingに条件を設定する

ここまででリクエストをPASSする設定が完了です。ただし、このままだとこの設定がすべてのリクエストに適用されてしまうので、このPASS設定を適用する条件を作成します。

1.作成したRequest Settingの右側にある Attach a condition をクリックして下さい

2. Add a condition to XXXウインドウが表示されますので"Create a new request condition"をクリックして下さい。以下のような画面が表示されます。
3. Create a new request conditionに以下に必要な内容を入力して下さい。

 ・ Type: Request
 ・ Name: 条件を識別するための適当な名前
 ・ Apply if: 適用したい条件(Conditions)を入力して下さい
 例えばリクエストURLが"/special"で始まるリクエストを選択する場合は
 req.url ~ "^/special"

 拡張子がphpまたはhtmlの場合は以下のようになります。
 req.url.ext ~ "(php|html)$"

 Conditionsの詳細については以下のサイトを参照して下さい。
 https://docs.fastly.com/guides/conditions/using-conditions

  1. Save and applyをクリックして下さい

以上で設定は完了です。設定内容を本番環境に反映させるためには、作成したVersionを開いた状態でページの上の方にあるActivateをクリックして下さい

なお、OptionのShowVCLから生成されたVCLを確認する事が出来ます。上記の手順が正しく完了していれば以下のような内容が生成されます。

sub vcl_recv {

//省略

  # Request Condition: Extension is php or html Prio: 10
  if( req.url.ext ~ "(php|html) ) {    

       if (!req.http.Fastly-FF) {
         if (req.http.X-Forwarded-For) {
           set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For ", " client.ip;
         } else {
           set req.http.Fastly-Temp-XFF = client.ip;
         }
       } else {
         set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For;
       }

        return(pass);  

      }
  #end condition

//省略

}