在 nginx 中使用路径时,我无法让反向代理正常工作。我想做的是为应用程序设置一个地址,并用路径指定环境。根据路径,它会指向不同的服务器。使用直接链接时,我能够让反向代理正常工作,但使用路径会出现 404 错误。
app.foo.bar/dev = 404 错误 devapp.foo.bar = 成功
我在 app.foo.bar/dev 上做错了什么?
这是正在运行的反向代理设置,但我不想使用:
server {
listen 80; # DEV Application Proxy
server_name devapp.foo.bar;
location / {
proxy_pass http://appserver.foo.bar:7010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
port_in_redirect off;
proxy_redirect http://appserver.foo.bar:7010/ /;
proxy_connect_timeout 300;
}
}
这是我想要使用路径执行的部分操作,但是出现 404 错误。
# APP Environment Proxy
server {
listen 80;
server_name app.foo.bar;
location /dev {
proxy_pass http://appserver.foo.bar:7010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
port_in_redirect off;
proxy_redirect http://appserver.foo.bar:7010 /;
proxy_connect_timeout 300;
}
}
我已经在 Google 上搜索过这种设置,但找不到解决方案。在此先感谢您的帮助。
答案1
当您有时proxy_pass http://appserver.foo.bar:7010;
,nginx 会将规范化的 URI 附加到传递给后端的请求 URL。
因此,当您请求时http://app.foo.bar/dev
,请求将转到http://appserver.foo.bar:7010/dev
。如果您的开发服务器没有此路径,则它将返回 404,nginx 将返回给客户端。
如果您希望所有以 开头的请求都http://app.foo.bar/dev
转到 ,http://appserver.foo.bar:7010
以便将 URI 的其余部分添加到后端服务器 URI,那么您可以使用此配置:
location ~ ^/dev(.+)$ {
proxy_pass http://appserver.foo.bar:7010$1$is_args$args;
...
}
因此,我们将正则表达式后的部分捕获/dev
到一个变量中,然后将该变量添加到proxy_pass
路径的末尾。