如何使用nginx proxy_pass保留请求URL

Dmy*_*iak 69 ruby proxy nginx thin unicorn

我试图使用Thin app服务器并遇到一个问题.

当nginx 代理使用proxy_pass http://my_app_upstream;应用程序对Thin(或Unicorn)的请求接收由nginx(http://my_app_upstream)发送的修改后的URL .

我想要的是从客户端传递原始URL和原始请求而不进行任何修改,因为应用程序非常依赖它.

nginx的" DOC说:

如果需要以未处理的形式传输URI,则应使用指令proxy_pass而不使用URI部分.

但我不明白如何配置,因为相关的示例实际上使用URI:

location  /some/path/ {
  proxy_pass   http://127.0.0.1;
}
Run Code Online (Sandbox Code Playgroud)

那么请你帮我弄清楚如何保留客户端的原始请求URL

yib*_*ibe 115

我认为该proxy_set_header指令有助于:

location / {
    proxy_pass http://my_app_upstream;
    proxy_set_header Host $host;
    # ...
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意其他人发现这一点:使nginx不操作URL的解决方案的核心是删除`proxy_pass`指令末尾的斜杠.`http:// my_app_upstream` vs`http:// my_app_upstream /` (76认同)
  • 就我而言,@ HugoJosefson的解决方案无效.我指着http:// localhost:port; 我不得不设置标题. (3认同)
  • 对我来说,发生的事情是当JSP进行重定向时,my_app_upstream主机名出现了.使用`proxy_set_header Host $ host`进行修改,使Tomcat/JSP认为它是一个实际的客户端请求域.谢谢您的帮助 (2认同)
  • 这是一项改进,但未保留方案(http 或 https)。现在我的 `https://example.com/page` uri 变成了 `http://example.com/page` (2认同)

GKi*_*lin 10

我的情况只是proxy_set_header Host $ host miss port.解决方法:



    location / {
     proxy_pass http://BACKENDIP/;
     include /etc/nginx/proxy.conf;
    }

Run Code Online (Sandbox Code Playgroud)

然后在proxy.conf中



    proxy_redirect off;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是我缺少的部分($server_port),以便在代理后面的端点上进行 OAuth 验证。 (2认同)

小智 5

nginx 还提供了 $http_host 变量,它将为您传递端口。它是主机和端口的串联。

所以你只需要做:

proxy_set_header Host $http_host;
Run Code Online (Sandbox Code Playgroud)


Wal*_*alf 5

如果某些内容修改了您尝试提供服务的位置,例如try_files,这会保留对后端的请求:

location / {
  proxy_pass http://127.0.0.1:8080$request_uri;
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*ski 5

请注意其他发现此问题的人:使 nginx 不操纵 URL 的解决方案的核心是删除 Copy: proxy_pass 指令末尾的斜杠。http://my_app_upstreamhttp://my_app_upstream/ – 雨果约瑟夫森

我在上面的评论中发现了这一点,但我认为这真的应该是一个答案。