正则表达式 (REGEX) 用在负载均衡器规则的匹配条件中。
支持兼容 Perl 的正则表达式 (Perl Compatible Regular Expression, 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/(?<year>\d+)-(?<month>\d+)-(?<day>\d+)/(?<article>.*) 来匹配类似于 /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 - 请求中的参数
- $_arg_<name> - 请求行中的参数 <name>
- $_cookie_<name> - <name> Cookie 的值
- $_upstream_cookie_<name> - 由“Set-Cookie”响应标头字段中的上游服务器发送的具有指定名称的 Cookie
- $_upstream_http_<name> - 任意响应标头字段,<name> 是字段名称,该字段名称将转换为小写,并且其中的短划线将替换为下划线
- $_host - 按优先级顺序,请求行中的主机名,或者“Host”请求标头字段中的主机名或与请求匹配的服务器名称
- $_http_<name> - 任意请求标头字段,<name> 是字段名称,该字段名称将转换为小写,并且其中的短划线将替换为下划线
- $_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_escaped_cert - 以 PEM 格式返回建立的 SSL 连接的客户端证书。
- $_ssl_server_name - 通过 SNI 返回请求的服务器名称
- $_uri - 请求中的 URI 路径
- $_ssl_ciphers:返回客户端 SSL 密码
- $_ssl_client_i_dn:根据 RFC 2253 返回建立的 SSL 连接的客户端证书的“颁发者 DN”字符串
- $_ssl_client_s_dn:根据 RFC 2253 返回建立的 SSL 连接的客户端证书的“主体 DN”字符串
- $_ssl_protocol:返回建立的 SSL 连接的协议
- $_ssl_session_reused:如果重用 SSL 会话,则返回“r”,否则,返回“.”