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服务器上看到的内容。

文档声明:

。。。为了找到与给定请求匹配的位置,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。

最新更新