使用正则表达式将变量映射到$ 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标头。但是地图似乎总是会默认。
答案 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;
}