我需要将位置代理/v1/api/
到另一个 url,如下所示:
location /api/v1/ {
proxy_pass http://frontend-api.preprod.my-app.com/api/v1/;
}
然而,在主流中,只收到了以下信息:
"GET /api/v1/ HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
因为上游配置为特定域frontend-api.preprod.my-app.com
:
server {
listen 80;
server_name frontend-api.preprod.my-app.com;
location / {
root /var/www/frontend_api/current/public;
# Turn on Passenger
passenger_enabled on;
passenger_ruby /home/deploy/.rvm/gems/ruby-2.7.2/wrappers/ruby;
}
}
最终结果是 404,如何在代理服务器上配置 proxy_pass 以发送主机,以便接收服务器接收完整的 url 而不仅仅是/api/v1/
?
答案1
nginx 文档解释该行为:
如果 proxy_pass 指令指定了 URI,那么当请求传递到服务器时,规范化请求 URI 中与位置匹配的部分将被指令中指定的 URI 替换:
/api/v1/
在您的情况下,这意味着请求 URI 被指令中指定的 URI替换proxy_pass
。
如果您希望按原样传递 URI,则需要执行以下操作:
location /api/v1/ {
proxy_pass http://frontend-api.preprod.example.com;
}
在这种情况下,nginx 使用原始请求中的 URI 和目标proxy_pass
,如下所述:
如果指定了 proxy_pass 但没有指定 URI,则在处理原始请求时,请求 URI 将以客户端发送的相同形式传递给服务器,或者在处理更改的 URI 时传递完整的规范化请求 URI:
如果要将请求 URI 的一部分替换为不同的部分,则需要使用正则表达式捕获:
location ~ ^/source/path/(.*) {
proxy_pass http://example.com/destination/path/$1;
}
编辑:
要获取传递给上游的原始请求的域名,需要设置Host
上游请求的 HTTP 标头:
proxy_set_header Host $host;
通过标头传递访问者的 IP 地址通常也很有用:
proxy_set_header X-Forwarded-For $remote_addr;