You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:34:56