首页 > 解决方案 > Nginx 反向代理路径名冲突

问题描述

我目前在同一台机器上运行两个网络服务器,一个通过 Gunicorn 使用 Django,这是我的原始站点,另一个用作使用相同域的在线商店,这个使用 Nestjs(Nodejs)。两台服务器都有一个/admin路径,原始路径位于 example.com/admin,另一个我想位于 example.com/store/admin。但是,每当我在浏览器中输入第二个 URL(即 example.com/store/admin)时,它都会返回另一个管理页面 example.com/admin(没有 /store 前缀)。这是我认为需要修改的配置片段:

server {
        server_name example.com www.example.com;

        location / {
                include proxy_params;
                proxy_pass http://unix:/run/gunicorn.sock;
        }
        location /store {
                proxy_pass http://127.0.0.1:3000/;
        }
        location = /store/admin {
                proxy_pass http://127.0.0.1:3000/admin/;
        }
    ...
}

我已经尝试了一些 /store 和 /store/admin 位置块的组合,但似乎无法让它将我引导到商店的服务器管理站点。使用 nodejs 服务器进行测试时,它可以在我的本地开发机器上运行。转到http://example.com/store会返回我期望从 Nestjs 服务器看到的内容。

标签: node.jsnginx

解决方案


文档指出:

...要查找与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,匹配前缀最长的位置被选中并记忆。...

所以你只需要两个位置块:

首先 :

location / {
  include proxy_params;
  proxy_pass http://unix:/run/gunicorn.sock;
}

另一个是重写:

location /store {
  rewrite ^/store(.*) $1 break;
  proxy_pass http://127.0.0.1:3000;
}

这意味着它将重写每个以 URL 开头/store的 URL,并将其从 URL 中删除,然后再传递到上游。这也包括/admin, 因为它是相同的。

/另请注意 -末尾没有后缀,proxy_pass它指示 NGINX 采用用户提供的 URI。


推荐阅读