Nginx反向代理路径名冲突

时间:2020-04-28 01:53:28

标签: node.js nginx

我目前正在同一台计算机上运行两个Web服务器,一个通过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服务器看到的内容。

1 个答案:

答案 0 :(得分:1)

docs指出:

...要查找与给定请求匹配的位置,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;
}

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

还请注意,/的末尾没有后缀proxy_pass-指示NGINX接受用户提供的URI。