Nginx将多变量正则表达式映射为一个变量

Nginx将多变量正则表达式映射为一个变量,nginx,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;

使用正则表达式将变量映射到$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;
}

我使用postman发送自定义http头。但map似乎总是默认值。

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

您可以重写正则表达式以匹配空变量,或者只使用命名捕获来匹配包含有效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;
}
map“$http\u cf\u connecting\u ip@$http\u cdn\u src\u ip@$http\u src\u ip@$http\u client\u ip”$clientIP{
(d+\.\d+\.\d+\.\d+.\d+.($\@)$ipaddr;
默认$remote\u addr;
}
完全正确“空变量可能只是空的,而不是包含文字连字符”,我正在调试access\u日志中的变量,谢谢。