在 nginx 中,配合 upstream 实现动态路径分发通常利用 proxy_pass 的 uri 拼接特性。具体做法是在 location 块中使用正则表达式捕获路径参数,然后在 proxy_pass 指令中引用这些变量,nginx 会自动将捕获的值拼接到后端地址后。如果 proxy_pass 包含 uri 部分,nginx 会用匹配到的 uri 替换原始请求中的 uri;如果不包含 uri 部分,则保留原始 uri。这种机制无需复杂的 rewrite 规则即可实现灵活的路由。

如何配置 location 以捕获路径并转发
通过定义带有捕获组的 location ~ ^/api/(.*)$ 可以提取路径片段。在 proxy_pass 中指定目标 URL 并追加 $1 变量,Nginx 会将请求路径中的对应部分传递给上游服务器。例如,访问 /api/users 会被转发到 http://backend/api/users。这种方式直接利用了 Nginx 的变量替换功能,避免了额外的重写开销。

server {
listen 80;
server_name example.com;
upstream backend {
server 127.0.0.1:8080;
}
location ~ ^/api/(.*)$ {
proxy_pass http://backend/$1;
}
}
如何处理不同前缀的动态路由
对于需要区分不同业务模块的场景,可以在 location 中捕获多个参数或使用不同的正则模式。例如,使用 location ~ ^/(?<module>[a-z]+)/(?<id>\d+)$</id></module> 可以分别捕获模块名和 ID。在 proxy_pass 中构建完整的后端路径,如 http://backend/modules/$module/items/$id。这种方法允许根据路径结构动态决定后端处理逻辑,适用于微服务架构中的网关层。

server {
listen 80;
server_name example.com;
upstream backend {
server 127.0.0.1:8080;
}
location ~ ^/(?<module>[a-z]+)/(?<id>\d+)$ {
proxy_pass http://backend/modules/$module/items/$id;
}
}
当 proxy_pass 不包含 URI 时会发生什么
如果 proxy_pass 指令后面没有跟随 URI 路径,Nginx 会将原始请求的完整 URI 原封不动地传递给后端服务器。这意味着即使使用了 location 的正则匹配,后端收到的请求路径仍然是客户端发送的原始路径。这种行为在某些场景下非常有用,比如后端应用自己负责解析路径结构,或者需要保持 URL 的原始性以便日志记录和分析。此时,proxy_pass 仅作为代理目标,不参与路径的重写或拼接。


















