CloudflareのWaiting RoomでHTTPヘッダを参照するバイパスルールをダッシュボードから作成してみた

CloudflareのWaiting RoomでHTTPヘッダを参照するバイパスルールをダッシュボードから作成してみた

CloudflareのWaiting Roomで、あるHTTPリクエストヘッダが特定の値の場合に待合室をバイパスするルールを作成してみました。バイパスルール画面の式ビルダーでは作成できないのでカスタムルール画面で式を作成し、バイパスルール画面の式編集でその式を記載するのがポイントです。
2026.10.31

はじめに

清水です。CloudflareのWaiting Roomで、あるHTTPリクエストヘッダが特定の値の場合に待合室をバイパスするというバイパスルールを作成する機会がありました。ダッシュボードからバイパスルールを作成する際に式ビルダーを使おうとしたのですが、HTTPヘッダをを選択することができません。しかし式を直接編集することでHTTPヘッダを参照するバイパスルールを作成することができ、意図した動作をさせることができたので、記録としてまとめとおこうと思います。式の作成にはカスタムルール作成画面の式ビルダーを使用しました。また実際に作成したバイパスルールで待合室がバイパスできるかの確認をすべてキューイングさせる状態で行いました。

検証用Waiting Roomの準備

まずは検証用のWaiting Roomを作成します。https://waiting-room-test.example.com/ というサイトをCloudflare経由で利用できるよう準備しました。オリジンオリジンサーバはAmazon EC2上でNode.jsを稼働させ、リクエストヘッダーなどの情報をそのまま返すものとしています。以下のような動作です。

 % curl https://waiting-room-test.example.com/
== Request ==
Method: GET
URL: /
HTTP Version: 1.1
Remote Address: 172.70.123.96
Remote Port: 28454
Server Time: 2026-10-29T07:10:48.826Z

== Headers (12) ==
x-forwarded-for: XXX.XXX.XXX.XXX
accept: */*
user-agent: curl/8.7.1
cf-ray: a5xxxxxxxxxxxx86-NRT
cdn-loop: cloudflare; loops=1
CF-Connecting-IP: XXX.XXX.XXX.XXX
CF-IPCountry: JP
CF-Visitor: {"scheme":"https"}
X-Forwarded-Proto: https
connection: Keep-Alive
Host: waiting-room-test.example.com
accept-encoding: gzip, br

== Cookies (raw) ==
(なし)

== Cookies (parsed) ==
(なし)

Waiting Roomは以下の設定で作成しました。基本的にはデフォルト設定を利用していますが、JSON応答の項目だけ意図的に有効にしています。

Waiting Room設定後、サイトにアクセスしてみます。ユーザ数が少ない(検証している本人のアクセスのみ)なので、そのままレスポンスが返ります。

 % curl https://waiting-room-test.example.com/
== Request ==
Method: GET
URL: /
HTTP Version: 1.1
Remote Address: 172.71.24.143
Remote Port: 28060
Server Time: 2026-10-29T07:14:25.983Z

== Headers (13) ==
x-forwarded-for: XXX.XXX.XXX.XXX
CF-Visitor: {"scheme":"https"}
CF-EW-Via: 15
CDN-Loop: cloudflare; loops=1; subreqs=1
CF-Connecting-IP: XXX.XXX.XXX.XXX
User-Agent: curl/8.7.1
cf-ray: a5xxxxxxxxxxxxb2-NRT
accept-encoding: gzip
Accept: */*
CF-IPCountry: JP
X-Forwarded-Proto: https
connection: Keep-Alive
Host: waiting-room-test.example.com

== Cookies (raw) ==
(なし)

== Cookies (parsed) ==
(なし)

動作確認のため、「すべてキューイング」を有効にして待合室が表示されるようにします。

待合室のレスポンスに変わりました。といってもテキストだとわかりにくいですね。

 % curl https://waiting-room-test.example.com/
<!DOCTYPE html>
<html>
  <head>
    <title>Waiting Room powered by Cloudflare</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
      * {
        box-sizing: border-box;
      }
<以下略>      

Webブラウザで表示すると以下の画面が表示される状態です。

この確認を容易にするため、先ほど設定した「JSON応答」を利用します。リクエスト時にAccept: application/jsonヘッダを付与することで、JSON形式の応答を得られる機能ですね。本来はアプリケーションで利用する想定のものですが、今回は確認用に利用しました。

 % curl https://waiting-room-test.example.com/ \
>       -H "Accept: application/json"
{"cfWaitingRoom":{"inWaitingRoom":true,"waitTimeKnown":false,"waitTime":0,"waitTimeHours":0,"waitTimeHourMinutes":0,"waitTime25Percentile":0,"waitTime50Percentile":0,"waitTime75Percentile":0,"waitTimeFormatted":"unavailable","queueIsFull":false,"queueAll":true,"lastUpdated":"2026-10-29T07:19:17.281Z","refreshIntervalSeconds":20,"queueingMethod":"fifo","isFIFOQueue":true,"isRandomQueue":false,"isPassthroughQueue":false,"isRejectQueue":false,"isEventActive":false,"isEventPrequeueing":false,"timeUntilEventStart":0,"timeUntilEventStartHours":0,"timeUntilEventStartHourMinutes":0,"timeUntilEventStartFormatted":"unavailable","timeUntilEventEnd":0,"timeUntilEventEndHours":0,"timeUntilEventEndHourMinutes":0,"timeUntilEventEndFormatted":"unavailable","shuffleAtEventStart":false}}

ちなみにJSONをフォーマットすると以下のようになります。

{
  "cfWaitingRoom": {
    "inWaitingRoom": true,
    "waitTimeKnown": false,
    "waitTime": 0,
    "waitTimeHours": 0,
    "waitTimeHourMinutes": 0,
    "waitTime25Percentile": 0,
    "waitTime50Percentile": 0,
    "waitTime75Percentile": 0,
    "waitTimeFormatted": "unavailable",
    "queueIsFull": false,
    "queueAll": true,
    "lastUpdated": "2026-10-29T07:19:17.281Z",
    "refreshIntervalSeconds": 20,
    "queueingMethod": "fifo",
    "isFIFOQueue": true,
    "isRandomQueue": false,
    "isPassthroughQueue": false,
    "isRejectQueue": false,
    "isEventActive": false,
    "isEventPrequeueing": false,
    "timeUntilEventStart": 0,
    "timeUntilEventStartHours": 0,
    "timeUntilEventStartHourMinutes": 0,
    "timeUntilEventStartFormatted": "unavailable",
    "timeUntilEventEnd": 0,
    "timeUntilEventEndHours": 0,
    "timeUntilEventEndHourMinutes": 0,
    "timeUntilEventEndFormatted": "unavailable",
    "shuffleAtEventStart": false
  }
}

想定するバイパス条件とルールの作成

検証用のWaiting Roomの準備ができました。ここで、今回設定したいバイアパスルールの詳細を確認しておきましょう。あるHTTPリクエストヘッダ、が特定の値の場合に待合室をバイパスという条件です。HTTPリクエストヘッダはx-waiting-room-bypass-key とします。このHTTPリクエストヘッダが特定の値の場合にバイパスルールを適用、通常のアクセスでは待合室が表示される中でも、オリジンサーバへアクセスできるようにする、というのが設定内容です。

特定の値はUUIDを利用しました。以下コマンドで生成した値、7e2fcdc8-d0b1-464e-b0be-4a51c19a3449を利用します。

 % uuidgen | tr '[:upper:]' '[:lower:]'

7e2fcdc8-d0b1-464e-b0be-4a51c19a3449

バイパスルール作成画面からバイパスルール作成を試みます。ルール名を設定、式ビルダーでフィールドを選択してHTTPヘッダを探しますが、見つかりませんね。

例えばセキュリティルールのカスタムルール作成では、フィールドの項目に「ヘッダー」があります。リクエスト一致条件に利用できないわけではなさそうです。

ひとまず、カスタムルール作成の画面の式ビルダーで想定の条件を指定し、「式のプレビュー」から式を得ます。(Cloudflare Ruleset Engineのドキュメン、Rules languageのFiled referenceなどを参照して作成することもできそうですが、今回は式ビルダーを使用しました。)

(any(http.request.headers["x-waiting-room-bypass-key"][*] eq "7e2fcdc8-d0b1-464e-b0be-4a51c19a3449"))

Waiting Roomのバイパスルール作成画面に戻ります。「式を編集」のリンクを押下して、式ビルダーから式の編集画面に切り換えます。編集部分に上記の式をそのままコピペし、[保存してデプロイ]ボタンを押下します。

無事にバイパスルールとして設定できました。

注意点として、編集の際などに「式ビルダーを使用」のリンクで編集画面から式ビルダーに切り替えようとすると、「現在の式は式ビルダーがサポートしていないため破棄されます」と表示されます。内容を破棄して式ビルダーを使った新しいバイパスルールにするか、このまま式編集画面で操作するか、どちらかを選択する必要があります。

バイパスルールの動作確認

無事にHTTPヘッダを利用したバイパスルールが作成できました。続いては動作確認を行います。

先ほど確認したとおり、HTTPヘッダ x-waiting-room-bypass-key を付与しないアクセスでは「すべてキューイング」機能で待合室が表示される状況です。

 % curl https://waiting-room-test.example.com/ \
>       -H "Accept: application/json"
{"cfWaitingRoom":{"inWaitingRoom":true,"waitTimeKnown":false,"waitTime":0,"waitTimeHours":0,"waitTimeHourMinutes":0,"waitTime25Percentile":0,"waitTime50Percentile":0,"waitTime75Percentile":0,"waitTimeFormatted":"unavailable","queueIsFull":false,"queueAll":true,"lastUpdated":"2026-10-29T07:39:15.358Z","refreshIntervalSeconds":20,"queueingMethod":"fifo","isFIFOQueue":true,"isRandomQueue":false,"isPassthroughQueue":false,"isRejectQueue":false,"isEventActive":false,"isEventPrequeueing":false,"timeUntilEventStart":0,"timeUntilEventStartHours":0,"timeUntilEventStartHourMinutes":0,"timeUntilEventStartFormatted":"unavailable","timeUntilEventEnd":0,"timeUntilEventEndHours":0,"timeUntilEventEndHourMinutes":0,"timeUntilEventEndFormatted":"unavailable","shuffleAtEventStart":false}}%

ヘッダ x-waiting-room-bypass-key に値 7e2fcdc8-d0b1-464e-b0be-4a51c19a3449を指定してアクセスしてみましょう。待合室(のJSONデータ)ではなく、オリジンサーバからのレスポンスが返ってきました。待合室をバイパスできていることが確認できますね。

 % curl https://waiting-room-test.example.com/ \
>       -H "Accept: application/json" \
>       -H "x-waiting-room-bypass-key: 7e2fcdc8-d0b1-464e-b0be-4a51c19a3449"
== Request ==
Method: GET
URL: /
HTTP Version: 1.1
Remote Address: 172.64.213.154
Remote Port: 32420
Server Time: 2026-10-29T07:41:04.633Z

== Headers (13) ==
x-forwarded-for: XXX.XXX.XXX.XXX
x-waiting-room-bypass-key: 7e2fcdc8-d0b1-464e-b0be-4a51c19a3449
accept: application/json
user-agent: curl/8.7.1
cf-ray: a5xxxxxxxxxxxx8f-NRT
cdn-loop: cloudflare; loops=1
CF-Connecting-IP: XXX.XXX.XXX.XXX
CF-IPCountry: JP
CF-Visitor: {"scheme":"https"}
X-Forwarded-Proto: https
connection: Keep-Alive
Host: waiting-room-test.example.com
accept-encoding: gzip, br

== Cookies (raw) ==
(なし)

== Cookies (parsed) ==
(なし)

ヘッダ x-waiting-room-bypass-key の値が異なっていた場合のケースも確認してきます。こちらはきちんと待合室のJSONデータが返ってきました。ヘッダ名のみではなく、きちんとヘッダの値まで参照してバイアパスルールが動作しています。

 % curl https://waiting-room-test.example.com/ \
>       -H "Accept: application/json" \
>       -H "x-waiting-room-bypass-key: wrong-key-value"
{"cfWaitingRoom":{"inWaitingRoom":true,"waitTimeKnown":false,"waitTime":0,"waitTimeHours":0,"waitTimeHourMinutes":0,"waitTime25Percentile":0,"waitTime50Percentile":0,"waitTime75Percentile":0,"waitTimeFormatted":"unavailable","queueIsFull":false,"queueAll":true,"lastUpdated":"2026-10-29T07:43:23.747Z","refreshIntervalSeconds":20,"queueingMethod":"fifo","isFIFOQueue":true,"isRandomQueue":false,"isPassthroughQueue":false,"isRejectQueue":false,"isEventActive":false,"isEventPrequeueing":false,"timeUntilEventStart":0,"timeUntilEventStartHours":0,"timeUntilEventStartHourMinutes":0,"timeUntilEventStartFormatted":"unavailable","timeUntilEventEnd":0,"timeUntilEventEndHours":0,"timeUntilEventEndHourMinutes":0,"timeUntilEventEndFormatted":"unavailable","shuffleAtEventStart":false}}%

まとめ

CloudflareのWaiting Roomで、あるHTTPリクエストヘッダが特定の値の場合に待合室をバイパスするバイパスルールをダッシュボードから作成してみました。Waiting Roomのバイアパスルール作成画面では、式ビルダーからHTTPヘッダをフィールドとして参照するルールは作成できません。いちどカスタムルール作成画面の式ビルダーで同様の式を作成、その式をバイアパスルール作成画面で直接式を編集できる状態にして記載する、というところがポイントです。作成済みのバイアパスルールに対して、バイアパスルール編集画面で式ビルダーに切り替えようとすると作成した式が破棄されてしまうことも注意しましょう。

この記事をシェアする

関連記事