← Cloudflare Ruleset Engine / ruleset-engine / rules-language
Operátory a seskupovací symboly
Cloudflare Rules language podporuje porovnávací a logické operátory:
- Porovnávací operátory určují, jak musí hodnoty definované ve výrazu souviset se skutečnou hodnotou HTTP požadavku, aby výraz vrátil
true. - Logické operátory kombinují dva výrazy do složeného výrazu a pomocí priority operátorů určují, jak se výraz vyhodnotí.
Symboly seskupení umožňují organizovat výrazy, vynucovat prioritu a vnořovat výrazy.
Porovnávací operátory
Operátory porovnání vracejí true pokud hodnota z HTTP požadavku odpovídá hodnotě definované ve výrazu.
Toto je obecný vzor pro použití porovnávacích operátorů:
<field> <comparison_operator> <value>Rules language podporuje tyto porovnávací operátory:
| Název | Zápis operátorů | Podporované datové typy | ||||
|---|---|---|---|---|---|---|
| Angličtina | Styl jazyka C | Řetězec1 | IP | Číslo | Příklad (operátor tučně) | |
| Stejné jako | eq | == | ✅ | ✅ | ✅ | http.request.uri.path eq "/articles/2008/" |
| Nerovná se | ne | != | ✅ | ✅ | ✅ | ip.src ne 203.0.113.0 |
| Less than | lt | < | ✅ | ❌ | ✅ | cf.waf.score lt 10 |
| Less than nebo rovno | le | <= | ✅ | ❌ | ✅ | cf.waf.score le 20 |
| Větší než | gt | > | ✅ | ❌ | ✅ | cf.waf.score gt 25 |
| Větší než nebo rovno | ge | >= | ✅ | ❌ | ✅ | cf.waf.score ge 60 |
| Obsahuje | contains | ✅ | ❌ | ❌ | http.request.uri.path contains "/articles/" | |
| Zástupný znak (nerozlišuje velká a malá písmena) | wildcard | ✅ | ❌ | ❌ | http.request.uri.path wildcard "/articles/*" | |
| Striktní zástupný znak (rozlišuje velká a malá písmena) | strict wildcard | ✅ | ❌ | ❌ | http.request.uri.path strict wildcard "/AdminTeam/*" | |
| Shody regulární výraz2 | matches | ~ | ✅ | ❌ | ❌ | http.request.uri.path matches "^/articles/200[7-8]/$" |
| Je v množině hodnot / seznamu3 | in | ✅ | ✅ | ✅ | ip.src in { 203.0.113.0 203.0.113.1 }ip.src.asnum in $<LIST> | |
1 Všechny řetězcové operátory rozlišují velká a malá písmena, pokud není výslovně uvedeno, že nerozlišují, jako například wildcard operátor.
2 Přístup k matches operátor vyžaduje plán Cloudflare Business nebo Enterprise.
3 V současnosti ne všechny produkty Cloudflare podporují seznamy ve svých výrazech. Další informace o seznamech najdete v Vložené seznamy a Seznamy.
Další operátory v dashboardu Cloudflare
V závislosti na konkrétním poli a typu pravidla může dashboard Cloudflare zobrazit následující další operátory:
-
starts with (což odpovídá
starts_with()funkce): Vracítruepokud řetězec začíná daným podřetězcem, afalsev opačném případě. -
ends with (což odpovídá
ends_with()funkce): Vracítruepokud řetězec končí daným podřetězcem, afalsev opačném případě. -
is in list (odpovídající
<FIELD> in $<LIST_NAME>): Vrátítruepokud je hodnota pole přítomna v zadaném seznam, afalsev opačném případě. Další informace najdete v Použití seznamů ve výrazech. -
is not in list (odpovídající
not <FIELD> in $<LIST_NAME>): Vrátítruepokud hodnota pole není přítomna v zadaném seznam, afalsev opačném případě. Další informace najdete v Použití seznamů ve výrazech.
Porovnávání řetězcových hodnot
Porovnávání řetězců ve výrazech pravidel rozlišuje velká a malá písmena. Pro zohlednění možných variant velikosti písmen ve výrazu můžete použít lower() a výsledek porovnat s řetězcem psaným malými písmeny, jak ukazuje následující příklad:
lower(http.request.uri.path) contains "/wp-login.php"Porovnávání se zástupnými znaky je podporováno pouze s wildcard a strict wildcard operátory a porovnávání pomocí regulárních výrazů je podporováno pouze s matches operátor.
Porovnávání se zástupnými znaky
wildcard operátor provádí porovnání nerozlišující velikost písmen mezi hodnotou pole a doslovným řetězcem obsahujícím nula nebo více * metaznaky. Každý * metaznak představuje nula nebo více znaků. strict wildcard operátor provádí podobné porovnání, ale rozlišuje velikost písmen.
Při použití wildcard/strict wildcard operátor musí celá hodnota pole odpovídat doslovnému řetězci se zástupnými znaky (doslovnému řetězci za operátorem).
# 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/Příklad 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)Lomítka (/) nemají ve shodách se zástupnými znaky žádný speciální význam. V tomto příkladu druhý * metaznak ve výrazu http.request.full_uri wildcard "*.example.com/*/page.html" odpovídalo folder, team, a team/subteam.
Příklad 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=foobarAlgoritmus porovnávání použitý v wildcard operátor nerozlišuje velká a malá písmena. Pro porovnávání se zástupnými znaky rozlišující velikost písmen použijte strict wildcard operátor.
Chcete-li zadat literál * znak v literálovém řetězci se zástupnými znaky musíte escapovat pomocí \*. Kromě toho musíte také escapovat \ pomocí \\. Dva neescapované * znaků po sobě (**) v literálovém řetězci se zástupnými znaky jsou považovány za neplatné a nelze je použít. Pokud potřebujete provést escapování znaků, doporučujeme použít syntaxe surových řetězců k zadání doslovného řetězce se zástupnými znaky.
Porovnávání pomocí regulárních výrazů
Zákazníci s plány Business a Enterprise mají přístup k matches operátor. Porovnávání pomocí regulárních výrazů se provádí pomocí enginu regulárních výrazů jazyka Rust.
Pokud používáte regulární výraz, můžete jej otestovat pomocí nástroje, jako je Regular Expressions 101 ↗ nebo Rustexp ↗.
Další informace o regulárních výrazech najdete v Řetězcové hodnoty a regulární výrazy.
Logické operátory
Logické operátory kombinují dva nebo více výrazů do jednoho složeného výrazu. Složený výraz má obecně tuto syntaxi:
<expression> <logical_operator> <expression>Podporované logické operátory
Každý logický operátor má pořadí priority. Pořadí priority (spolu s seskupovací symboly) určuje pořadí, ve kterém Cloudflare vyhodnocuje logické operátory ve výrazu. not operátor má v pořadí priority první místo.
| Název | Angličtina Notace | Styl jazyka C Notace | Příklad | Pořadí priority |
|---|---|---|---|---|
| Logický NOT | not | ! | not ( http.host eq "www.cloudflare.com" and ip.src in {203.0.113.0/24} ) | 1 |
| Logický AND | and | && | http.host eq "www.cloudflare.com" and ip.src in {203.0.113.0/24} | 2 |
| Logické XOR (exkluzivní OR) | xor | ^^ | http.host eq "www.cloudflare.com" xor ip.src in {203.0.113.0/24} | 3 |
| Logický OR | or | || | http.host eq "www.cloudflare.com" or ip.src in 203.0.113.0/24 | 4 |
Pořadí priority
Při psaní složených výrazů je důležité znát prioritu logických operátorů, aby se váš výraz vyhodnotil tak, jak očekáváte.
Uvažujme například následující obecný výraz, který používá and a or operátory:
Expression1 and Expression2 or Expression3Kdyby tyto operátory neměly stanovené pořadí vyhodnocování, nebylo by jasné, která ze dvou interpretací je správná:
- Shoda platí, pokud jsou pravdivé výraz 1 i výraz 2 nebo pokud je výraz 3 pravdivý.
- Shoda platí, pokud je výraz 1 pravdivý a je pravdivý výraz Expression 2 nebo Expression 3.
Vzhledem k tomu, že logický and operátor má přednost před logickým or, and operátor se musí vyhodnotit jako první. Výklad 1 je správný.
Abyste se při práci s logickými operátory vyhnuli nejednoznačnosti, použijte seskupovací symboly, aby bylo pořadí vyhodnocování jednoznačné.
Symboly seskupení
Rules language podporuje závorky ((,)) jako seskupovací symboly. Seskupovací symboly umožňují uspořádat výrazy, vynutit prioritu a vnořovat výrazy.
Pouze Expression Editor a Cloudflare API podporují seskupovací symboly. Expression Builder ne.
Seskupování výrazů
Pomocí závorek můžete explicitně seskupit výrazy, které mají být vyhodnoceny společně. V tomto příkladu závorky nemění způsob vyhodnocení výrazu, ale jednoznačně určují, které logické operátory se mají vyhodnotit jako první.
(Expression1 and Expression2) or Expression3Seskupovací symboly jsou natolik jednoznačné, že při jejich použití ve složených výrazech snáze předejdete chybám.
Vynucení priority
Symboly seskupení jsou účinným nástrojem pro vynucení priority seskupených prvků složeného výrazu. V tomto příkladu závorky vynucují, aby logický or operátor byl vyhodnocen dříve než logický and:
Expression1 and (Expression2 or Expression3)Bez závorek logický and operátor by měl přednost.
Vnořit výrazy
Výrazy seskupené závorkami můžete vnořovat do jiných skupin a vytvářet tak velmi přesné a propracované výrazy, jako je tento příklad pravidla určeného k blokování přístupu k doméně:
(
(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}Při vyhodnocování priority logických operátorů se ignorují závorky uvnitř řetězců ohraničených uvozovkami, jako je tomu v následujícím regulárním výrazu převzatém z výše uvedeného příkladu:
"^(www|store|blog)\.example\.com"