規則運算式 (REGEX) 用於負載平衡器規則的相符條件。

支援 Perl 相容規則運算式 (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"。設定變數後,可以在負載平衡器規則動作中使用這些變數。例如,可以使用相符的變數 (如 news.py?year=$year&month=$month&day=$day&article=$article) 重寫 URI。該 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> - 具有指定名稱且由上游伺服器在「設定 Cookie」回應標頭欄位中傳送的 Cookie
    • $_upstream_http_<name> - 任意回應標頭欄位,<name> 是轉換為小寫、且將虛線取代為底線的欄位名稱
    • $_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 - 針對已建立的 SSL 連線,傳回 PEM 格式的用戶端憑證。
    • $_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」,否則傳回「.」