Nginx将具有多个变量的正则表达式映射到一个变量

时间:2019-08-29 11:16:41

标签: nginx

使用正则表达式将变量映射到$ clientIP。

位于多个CDN后面的Web服务器,带有客户端真实IP的自定义标头有所不同。所以我得出了以下表达式。

#here I use @ as seperator
map "$http_cf_connecting_ip@$http_cdn_src_ip@$http_src_ip@$http_client_ip" $clientIP {

          "~[^-]+@-@-@-$"       $http_cf_connecting_ip;                 
          "~^-@[^-]+@-@-$"      $http_cdn_src_ip;        
          "~^-@-@[^-]+@-$"      $http_src_ip;             
          "~^-@-@-@[^-]+$"      $http_client_ip;
          "~^-@-@-@-$"          $remote_addr;
          default               $remote_addr;
}

我使用邮递员发送自定义的HTTP标头。但是地图似乎总是会默认。

1 个答案:

答案 0 :(得分:1)

空变量可能只是空的,而不是包含文字连字符。 访问日志使用连字符表示空值。

您可以重写正则表达式以匹配空变量,或者仅使用命名捕获来匹配包含有效IP地址的第一位。

例如:

map "$http_cf_connecting_ip@$http_cdn_src_ip@$http_src_ip@$http_client_ip" $clientIP {
    ~(^|@)(?<ipaddr>\d+\.\d+\.\d+\.\d+)($|@)    $ipaddr;
    default                                     $remote_addr;
}