Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

演算子とグループ化記号

最終更新 Markdown で表示Agent セットアップ

Cloudflare Rules language は、比較演算子と論理演算子をサポートします。

  • 比較演算子 は、式が true を返すために、式で定義した値と実際の HTTP リクエスト値がどう関係する必要があるかを指定します。
  • 論理演算子 は 2 つの式を複合式にまとめ、優先順位に従って式の評価順を決めます。

グループ化記号 で式を整理し、優先順位を強制し、式を入れ子にできます。

比較演算子

比較演算子は、HTTP リクエストの値が式で定義した値と一致するとき true を返します。

比較演算子の一般的な形は次のとおりです。

<field> <comparison_operator> <value>

Rules language は次の比較演算子をサポートします。

名前演算子の表記対応するデータ型
英語C 風String1IPNumber例(演算子は太字)
等しいeq==http.request.uri.path eq "/articles/2008/"
等しくないne!=ip.src ne 203.0.113.0
より小さいlt<cf.waf.score lt 10
以下le<=cf.waf.score le 20
より大きいgt>cf.waf.score gt 25
以上ge>=cf.waf.score ge 60
含むcontainshttp.request.uri.path contains "/articles/"
ワイルドカード
(大文字小文字を区別しない)
wildcardhttp.request.uri.path wildcard "/articles/*"
厳密なワイルドカード
(大文字小文字を区別する)
strict wildcardhttp.request.uri.path strict wildcard "/AdminTeam/*"
正規表現に一致2matches~http.request.uri.path matches "^/articles/200[7-8]/$"
値の集合 / リストに含まれる3inip.src in { 203.0.113.0 203.0.113.1 }
ip.src.asnum in $<LIST>

1 特に大文字小文字を区別しないと書いていない限り、すべての文字列演算子は大文字小文字を区別します。wildcard 演算子はその例外です。
2 matches 演算子を使うには、Cloudflare Business または Enterprise プランが必要です。
3 現在、すべての Cloudflare 製品が式でリストを使えるわけではありません。リストの詳細は インラインリストリスト を参照してください。

Cloudflare ダッシュボードの追加演算子

Cloudflare ダッシュボードでは、フィールドとルールの種類に応じて、次の追加演算子が表示されることがあります。

  • starts withstarts_with() 関数に対応): 文字列が指定の部分文字列で始まるとき true、そうでないとき false を返します。

  • ends withends_with() 関数に対応): 文字列が指定の部分文字列で終わるとき true、そうでないとき false を返します。

  • is in list<FIELD> in $<LIST_NAME> に対応): フィールド値が指定の リスト にあるとき true、そうでないとき false を返します。詳細は 式でリストを使う を参照してください。

  • is not in listnot <FIELD> in $<LIST_NAME> に対応): フィールド値が指定の リスト にないとき true、そうでないとき false を返します。詳細は 式でリストを使う を参照してください。

文字列値の比較

ルール式の文字列比較は大文字小文字を区別します。式で文字列の大文字小文字の揺れを吸収するには、lower() 関数を使い、結果を小文字の文字列と比較します。次の例です。

lower(http.request.uri.path) contains "/wp-login.php"

ワイルドカード照合wildcardstrict wildcard 演算子でのみ使え、正規表現照合matches 演算子でのみ使えます。

ワイルドカード照合

wildcard 演算子は、フィールド値と、0 個以上の * メタ文字を含むリテラル文字列を、大文字小文字を区別せずに照合します。各 * メタ文字は 0 文字以上を表します。strict wildcard 演算子も同様の照合をしますが、大文字小文字を区別します。

wildcard / strict wildcard 演算子を使うとき、フィールド値全体が、ワイルドカード付きのリテラル文字列(演算子の右側のリテラル)に一致する必要があります。

例 Atxt
# The following expression:
http.request.full_uri wildcard "http*://example.com/a/*"

# Would match the following URIs:
# - https://example.com/a/           (the '*' matches zero characters)
# - http://example.com/a/
# - https://example.com/a/page.html
# - https://example.com/a/sub/folder/?name=value

# Would NOT match the following URIs:
# - https://example.com/ab/
# - https://example.com/b/page.html
# - https://sub.example.com/a/

例 B

# The following expression:
http.request.full_uri wildcard "*.example.com/*/page.html"

# Would match the following URIs:
# - http://sub.example.com/folder/page.html
# - https://admin.example.com/team/page.html
# - https://admin.example.com/team/subteam/page.html

# Would NOT match the following URIs:
# - https://example.com/ab/page.html                   ('*.example.com' matches only subdomains)
# - https://sub.example.com/folder2/page.html?s=value  (http.request.full_uri includes the query string and its full value does not match)
# - https://sub.example.com/a/                         ('page.html' is missing)

スラッシュ(/)はワイルドカード照合で特別な意味を持ちません。この例では、式 http.request.full_uri wildcard "*.example.com/*/page.html" の 2 番目の * メタ文字が folderteamteam/subteam に一致しています。

例 C

# The following expression:
http.request.full_uri wildcard "*.example.com/*" or http.request.full_uri wildcard "http*://example.com/*"

# Would match the following URIs:
# - https://example.com/folder/list.htm
# - https://admin.example.com/folder/team/app1/
# - https://admin.example.com/folder/team/app1/?s=foobar

wildcard 演算子の照合アルゴリズムは大文字小文字を区別しません。大文字小文字を区別するワイルドカード照合には strict wildcard 演算子を使います。

ワイルドカード付きリテラル文字列にリテラルの * を入れるときは \* でエスケープする必要があります。さらに、\\\ でエスケープする必要があります。ワイルドカードリテラル文字列でエスケープされていない * が 2 つ連続する(**)のは不正で、使えません。文字のエスケープが必要な場合は、raw 文字列構文 でワイルドカード付きリテラル文字列を指定することをおすすめします。

正規表現照合

Business プランと Enterprise プランのお客様は matches 演算子を使えます。正規表現照合は Rust の正規表現エンジンで行われます。

正規表現を使う場合は、Regular Expressions 101Rustexp などのツールでテストできます。

正規表現の詳細は 文字列値と正規表現 を参照してください。

論理演算子

論理演算子は 2 つ以上の式を 1 つの複合式にまとめます。複合式の一般的な構文は次のとおりです。

<expression> <logical_operator> <expression>

使える論理演算子

各論理演算子には 優先順位 があります。優先順位(と グループ化記号)によって、Cloudflare が式内の論理演算子を評価する順が決まります。not 演算子の優先順位が最も高いです。

名前英語
表記
C 風
表記
優先順位
論理 NOTnot!not ( http.host eq "www.cloudflare.com" and ip.src in {203.0.113.0/24} )1
論理 ANDand&&http.host eq "www.cloudflare.com" and ip.src in {203.0.113.0/24}2
論理 XOR
(排他的論理和)
xor^^http.host eq "www.cloudflare.com" xor ip.src in {203.0.113.0/24}3
論理 ORor||http.host eq "www.cloudflare.com" or ip.src in 203.0.113.0/244

優先順位

複合式を書くときは、論理演算子の優先順位を把握し、意図どおりに評価されるようにしてください。

たとえば、andor を使う次の一般的な式を考えます。

Expression1 and Expression2 or Expression3

これらの演算子に優先順位がないと、次の 2 つの解釈のどちらが正しいか分かりません。

  1. Expression 1 と Expression 2 がどちらも true のとき、または Expression 3 が true のときに一致します。
  2. Expression 1 が true で、かつ Expression 2 または Expression 3 のいずれかが true のときに一致します。

論理 and は論理 or より優先されるため、and が先に評価されます。解釈 1 が正しいです。

論理演算子を使うときの曖昧さを避けるには、グループ化記号を使って評価順を明示してください。

グループ化記号

Rules language はグループ化記号として括弧(())をサポートします。グループ化記号で式を整理し、優先順位を強制し、式を入れ子にできます。

グループ化記号を使えるのは Expression EditorCloudflare API だけです。Expression Builder では使えません。

式をグループ化する

一緒に評価すべき式を、括弧で明示的にグループ化します。この例では、括弧は評価結果を変えませんが、どの論理演算子を先に評価するかを明確に示します。

(Expression1 and Expression2) or Expression3

グループ化記号は非常に明示的なので、複合式を書くときのミスが減ります。

優先順位を強制する

グループ化記号は、複合式のグループ化した要素に優先順位を強制する強力な手段です。この例では、括弧によって論理 or が論理 and より先に評価されます。

Expression1 and (Expression2 or Expression3)

括弧がなければ、論理 and が優先されます。

式を入れ子にする

括弧でグループ化した式を、さらに別のグループの中に入れ子にできます。非常に精密で高度な式を作れます。次は、ドメインへのアクセスをブロックするルールの例です。

(
 (http.host eq "api.example.com" and http.request.uri.path eq "/api/v2/auth") or
 (http.host matches "^(www|store|blog)\.example\.com" and http.request.uri.path contains "wp-login.php") or
 ip.src.country in {"CN" "TH" "US" "ID" "KR" "MY" "IT" "SG" "GB"} or ip.src.asnum in {12345 54321 11111}
) and not ip.src in {11.22.33.0/24}

論理演算子の優先順位を評価するとき、引用符で区切られた文字列の中の括弧は無視されます。上の例の次の正規表現がそれに当たります。

"^(www|store|blog)\.example\.com"

役に立ちましたか?