如何配置Nginx的location通配符?实现不同路径传自定义Header
Nginx Location正则匹配问题与最优实现
当前写法的问题
你用的正则写法完全错误,Nginx的location正则语法里,*是正则量词(表示匹配前面的字符0次或多次),不是shell里的通配符:
location ~ /deployments/*xx*/会被解析为:匹配/deployments/后接0个或多个/,再加上xx,再0个或多个/,这和你要匹配“包含xx的路径”的需求完全不符。- 你尝试的
location ~ /deployments/.*xx.*/多了末尾的/,如果请求路径结尾没有/就会匹配失败,而且写法冗余。
最优实现方案
根据你的需求(所有含xx的路径设val1,含yy的设val2,且proxy_pass相同),有两种简洁可靠的实现方式:
方案一:正则Location匹配(适合需区分优先级的场景)
利用正则location的匹配顺序,精准匹配目标路径:
server { # 匹配/deployments/下所有包含xx的路径 location ~ ^/deployments/.+xx.+$ { proxy_pass $uri; proxy_set_header custom-header val1; } # 匹配/deployments/下所有包含yy的路径 location ~ ^/deployments/.+yy.+$ { proxy_pass $uri; proxy_set_header custom-header val2; } # 可选:处理其他/deployments/下的路径 location /deployments/ { proxy_pass $uri; # 可设置默认header或留空 } }
^和$是锚点,确保匹配完整的请求路径;.+表示匹配至少一个任意字符,保证xx/yy前后有内容(若允许xx在路径开头/结尾,可替换为.*)。
方案二:单Location结合If指令(更简洁,推荐)
因为所有目标路径都在/deployments/下且proxy_pass相同,用单个location统一处理,通过if判断URI内容设置不同header:
server { location /deployments/ { proxy_pass $uri; # 匹配含xx的路径,设置val1(~*表示不区分大小写,区分大小写用~) if ($request_uri ~* xx) { proxy_set_header custom-header val1; } # 匹配含yy的路径,设置val2 if ($request_uri ~* yy) { proxy_set_header custom-header val2; } # 可选:设置默认header(当xx/yy都不匹配时生效) # proxy_set_header custom-header default-val; } }
$request_uri包含完整的请求URI,能准确判断路径中是否包含目标字符串;- 这种方式无需维护多个location,逻辑更清晰。
注意事项
- 如果
xx/yy包含正则特殊字符(如.、/等),需要用反斜杠转义,例如xx\.; - 若单个路径同时包含
xx和yy,后执行的if会覆盖前一个header,需根据需求调整if的顺序。
内容的提问来源于stack exchange,提问作者Shreyas Kulkarni
相关产品推荐
相关产品推荐

