Nginx基于URL路径动态转发需结合location匹配与proxy_pass,优先用正则捕获(如location ~ ^/api/v1/(.*)$ { proxy_pass http://backend1/$1; })或rewrite重写路径,注意proxy_pass末尾斜杠影响路径拼接,严格遵循匹配优先级(精确>前缀>正则)。

通过 Nginx 实现基于 URL 路径的动态转发,核心是利用 location 匹配规则 + proxy_pass 指令,并结合变量(如 $uri、$request_uri、$1 等)灵活重写或透传路径。关键在于理解匹配行为与路径拼接逻辑,避免常见 404 或路径重复问题。
用正则 location 捕获路径并动态代理
当需要将 /api/v1/users/xxx 转发到后端 http://backend1/users/xxx(去掉前缀),应使用带捕获组的正则 location:
- 写法示例:
location ~ ^/api/v1/(.*)$ {<br> proxy_pass http://backend1/$1;<br> proxy_set_header Host $host;<br>} -
proxy_pass末尾不加/,且后接变量(如$1),Nginx 才会把捕获内容拼接到目标地址后 - 若写成
proxy_pass http://backend1/;(末尾有斜杠),Nginx 会丢弃原始匹配路径,只转发根路径 —— 这是 404 的常见原因
用 rewrite 配合 proxy_pass 做更复杂的路径改写
当需修改路径结构(如把 /v2/data/123 改为 /api/resource?id=123),可先 rewrite 再 proxy:
- 示例:
location ^~ /v2/data/ {<br> rewrite ^/v2/data/(\d+)$ /api/resource?id=$1 break;<br> proxy_pass http://backend2;<br> proxy_set_header X-Original-URI $request_uri;<br>} -
break表示重写后不再进行后续 location 匹配,直接用新 URI 走 proxy_pass - 保留原始请求信息可用
$request_uri或自定义 header 传给后端,便于日志或调试
区分 prefix 匹配与正则匹配的优先级
Nginx 的 location 匹配有明确顺序:精确匹配 > 最长前缀匹配 > 正则匹配(按配置文件中出现顺序)。路径转发逻辑依赖于此:
- 想让
/api/admin优先走特殊后端,就用location = /api/admin或location ^~ /api/admin - 通用 API 转发用
location /api/(前缀匹配),它会匹配所有以/api/开头的请求,但会被更具体的规则覆盖 - 避免正则 location 写在通用前缀之后却期望它生效 —— 若前缀已匹配且无
proxy_pass,请求可能被错误处理
转发时透传原始路径与参数的注意事项
确保查询参数(?key=value)和路径中的特殊字符(如 %20)不丢失:
-
proxy_pass默认透传完整$request_uri(含 query string),无需额外配置 - 若用
rewrite,需显式保留参数:用?$args或$is_args$args,例如rewrite ^/old/(.*)$ /new/$1?$args break;
- 后端若依赖原始 Host 或协议,记得设置:
proxy_set_header Host $host;proxy_set_header X-Forwarded-Proto $scheme;


















