如何在 nginx 配置中代理完整的 url?

如何在 nginx 配置中代理完整的 url?

我需要将位置代理/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;

相关内容