Skip to content

Match Rules

Match rules decide when a rewrite action should run. A rule is placed in one of these lists:

yaml
header-rewrite: []
body-rewrite: []
url-redirect: []

Common fields:

FieldDescription
typeMatch rule type
match-valueValue used by the matcher
match-headerHeader name for Header matchers
actionRewrite action to execute
continueContinue evaluating later rules after this match

DOMAIN

DOMAIN matches the parsed request host exactly.

yaml
header-rewrite:
  - type: DOMAIN
    match-value: "example.com"
    action: DIRECT

It does not match subdomains.

DOMAIN-SUFFIX

DOMAIN-SUFFIX matches hosts ending with match-value.

yaml
header-rewrite:
  - type: DOMAIN-SUFFIX
    match-value: "example.com"
    action: DIRECT

Use it for a domain family such as example.com, api.example.com, and static.example.com.

DOMAIN-KEYWORD

DOMAIN-KEYWORD matches hosts containing match-value.

yaml
header-rewrite:
  - type: DOMAIN-KEYWORD
    match-value: "example"
    action: DIRECT

Use exact or suffix matching when substring matching is too broad.

DOMAIN-SET

DOMAIN-SET loads a domain list from a local file path or remote HTTP(S) URL and suffix-matches the parsed request host.

yaml
header-rewrite:
  - type: DOMAIN-SET
    match-value: "/etc/ua3f/domain-set.txt"
    action: DIRECT

Domain set files are parsed line by line. Empty lines and lines beginning with # are ignored. The set is loaded asynchronously during rule initialization.

IP-CIDR

IP-CIDR matches the remote destination IP against a CIDR range.

yaml
header-rewrite:
  - type: IP-CIDR
    match-value: "203.0.113.0/24"
    action: DIRECT

If the value does not include a prefix length, UA3F treats it as a single IPv4 host by appending /32.

SRC-IP

SRC-IP matches the client source IP against a CIDR range.

yaml
header-rewrite:
  - type: SRC-IP
    match-value: "192.168.1.0/24"
    action: REPLACE
    rewrite-header: "User-Agent"
    rewrite-value: "UA3F"

Use it to apply different policies to different LAN clients.

DEST-PORT

DEST-PORT matches the destination port as a string.

yaml
header-rewrite:
  - type: DEST-PORT
    match-value: "22"
    action: DIRECT

Quote the port in YAML to keep it as a string.

HEADER-KEYWORD

HEADER-KEYWORD matches when a request Header contains a keyword. Header value matching is case-insensitive.

yaml
header-rewrite:
  - type: HEADER-KEYWORD
    match-header: "User-Agent"
    match-value: "MicroMessenger"
    action: DIRECT

HEADER-REGEX

HEADER-REGEX matches a request Header with a case-insensitive regular expression.

yaml
header-rewrite:
  - type: HEADER-REGEX
    match-header: "User-Agent"
    match-value: "(Windows|Android|iPhone)"
    action: REPLACE-REGEX
    rewrite-header: "User-Agent"
    rewrite-regex: "(Windows|Android|iPhone)"
    rewrite-value: "UA3F"

Invalid expressions are logged and the rule will not match.

URL-REGEX

URL-REGEX matches the full request URL with a regular expression.

yaml
url-redirect:
  - type: URL-REGEX
    match-value: "^http://example.com/old"
    action: REDIRECT-302
    rewrite-regex: "^http://example.com/old(.*)"
    rewrite-value: "https://example.com/new$1"

Use anchors such as ^ when the rule should only match a URL prefix.

FINAL

FINAL always matches and is usually placed at the end of a rule list.

yaml
header-rewrite:
  - type: FINAL
    action: REPLACE
    rewrite-header: "User-Agent"
    rewrite-value: "UA3F"

Place specific rules before broad rules. If FINAL appears before other rules, later rules are normally unreachable unless continue: true is set.

Released under the GPL-3.0 license.