负载平衡器规则支持 REGEX 匹配类型。支持 PCRE 样式 REGEX 模式,但高级用例存在一些限制。在匹配条件中使用 REGEX 时,支持已命名捕获组。REGEX 限制包括:
不支持字符并集和交集。例如,不要使用 [a-z[0-9]] 和 [a-z&&[aeiou]],而要相应使用 [a-z0-9] 和 [aeiou]。
仅支持 9 个向后引用,可以使用 \1 到 \9 来引用它们。
请使用 \0dd 格式来匹配八进制数字,而不要使用 \ddd 格式。
顶层级别不支持嵌入式标记,嵌入式标记仅在组中受支持。例如,不要使用“Case (?i:s)ensitive”,而要使用“Case ((?i:s)ensitive)”。
不支持预处理操作 \l、\u、\L 和 \U。 其中 \l 是将下一字符变为小写,\u 是将下一字符变为大写,\L 将后续直至 \E 的字符变为小写,\U 则将后续直至 \E 的字符变为大写。
不支持 (?(condition)X)、(?{code})、(??{Code}) 和 (?#comment)。
不支持预定义的 Unicode 字符类 \X
不支持对 Unicode 字符使用已命名字符构造。例如,不要使用 \N{name},而要使用 \u2018。
在匹配条件中使用 REGEX 时,支持已命名捕获组。例如,可以使用 REGEX 匹配模式 /news/(?\d+)-(?\d+)-(?\d+)/(?.*) 来匹配类似于 /news/2018-06-15/news1234.html 的 URI。
然后按如下所示设置变量:$year = "2018" $month = "06" $day = "15" $article = "news1234.html"。设置变量后,可以在负载平衡器规则操作中使用这些变量。例如,可以使用匹配的变量来重写 URI,例如 /news.py?year=$year&month=$month&day=$day&article=$article。该 URI 随后重写为 /news.py?year=2018&month=06&day=15&article=news1234.html。
重写操作可以使用已命名捕获组和内置变量的组合。例如,URI 可以重写为 /news.py?year=$year&month=$month&day=$day&article=$article&user_ip=$_remote_addr。该示例 URI 随后重写为 /news.py?year=2018&month=06&day=15&article=news1234.html&user_ip=1.1.1.1。
注: 对于已命名捕获组,名称不能以字符 _ 开头。除了已命名捕获组之外,还可以在重写操作中使用以下内置变量。所有内置变量的名称均以 _ 开头。
$_args - 请求中的参数
$_cookie_ - Cookie 的值
$_host - 按优先级顺序,请求行中的主机名,或者“Host”请求标头字段中的主机名或与请求匹配的服务器名称
$_hostname - 主机名
$_http_ - 任意请求标头字段, 是字段名称,该字段名称将转换为小写,并且其中的短划线将替换为下划线
$_https - 如果连接在 SSL 模式下工作,为 "on";否则为 ""
$_is_args - 如果请求行包含参数,为 "?";否则为 ""
$_query_string - 与 $_args 相同
$_remote_addr - 客户端地址
$_remote_port - 客户端端口
$_request_uri - 完整的原始请求 URI(包含参数)
$_scheme - 请求方案“http”或“https”
$_server_addr - 接受请求的服务器的地址
$_server_name - 接受请求的服务器的名称
$_server_port - 接受请求的服务器的端口
$_server_protocol - 请求协议,通常为“HTTP/1.0”或“HTTP/1.1”
$_ssl_client_cert - 为已建立的 SSL 连接返回 PEM 格式的客户端证书,证书中除第一行以外的每一行开头均附加制表符字符
$_ssl_server_name - 通过 SNI 返回请求的服务器名称
$_uri - 请求中的 URI 路径