如何使用Nginx proxy_pass保留请求URL


78

我试图使用Thin App Server,但遇到一个问题。

当nginx代理使用proxy_pass http://my_app_upstream;应用程序向Thin(或Unicorn)发送请求时,会收到nginx(http://my_app_upstream)发送的修改后的URL 。

我想要的是传递原始URL和来自客户端的原始请求,而无需进行任何修改,因为该应用程序严重依赖它。

Nginx的文档说:

如果必须以未处理的形式传输URI,则应使用指令Proxy_pass而不带URI部分。

但由于相关示例实际上使用的是URI,因此我不知道如何准确配置它:

location  /some/path/ {
  proxy_pass   http://127.0.0.1;
}

那么,能否请您帮我弄清楚如何保留来自客户端的原始请求URL

Answers:


131

我认为该proxy_set_header指令可以帮助您:

location / {
    proxy_pass http://my_app_upstream;
    proxy_set_header Host $host;
    # ...
}

90
请其他人注意这一点:使Nginx不操纵URL的解决方案的核心是删除proxy_pass指令末尾的斜杠。http://my_app_upstreamvshttp://my_app_upstream/
雨果·约瑟夫森,2012年

2
对我来说,发生的事情是,当JSP执行重定向时,显示了my_app_upstream主机名。使用proxy_set_header Host $host经过修改并经过改进的Tomcat / JSP认为这是实际的客户端请求的域。感谢您的帮助
ankitjaininfo 2013年

1
@HugoJosefson哇,感谢上帝,我注意到了您的帖子。这应该是在明确的答案
加锁存

3
就我而言,@ HugoJosefson的解决方案不起作用。我指的是localhost:port ; 我必须设置标题。

2
这是一个改进,但是未保留该方案(http或https)。现在,我的https://example.com/page责任变成了http://example.com/page
约翰·史密斯

10

我的情况只是proxy_set_header Host $ host错过端口。解决者:



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

然后在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;


1
谢谢,这是我缺少的(用于让OAuth验证在代理后面的终结点上工作的)($ server_port)。
renier 2014年

我在sinatra上使用机架保护,并且在POST URL上被禁止。将端口添加到主机代理标头中对我来说固定。
pduey

这在Nginx的最新版本中不再起作用,我认为stackoverflow.com/questions/31482796/…–
iwein



3

如果某些地方修改了您要服务的位置,例如try_files,这将保留对后端的请求:

location / {
  proxy_pass http://127.0.0.1:8080$request_uri;
}

3

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

所以你只需要做:

proxy_set_header Host $http_host;

2

在我的场景中,我通过以下代码在nginx vhost配置中实现了这一点

server {
server_name dashboards.etilize.com;

location / {
    proxy_pass http://demo.etilize.com/dashboards/;
    proxy_set_header Host $http_host;
}}

$ http_host将在标头中设置与请求相同的URL


-1

对于我的身份验证服务器...这可行。我喜欢为自己的人性化可读性提供/ auth选项...或者我也可以通过端口/上游为机器对机器配置它。

在conf开头

####################################################
upstream auth {
    server 127.0.0.1:9011 weight=1 fail_timeout=300s;
    keepalive 16;
  }

在我的443服务器块中

          if (-d $request_filename) {
          rewrite [^/]$ $scheme://$http_host$uri/ permanent;
      }

  location /auth {
          proxy_pass http://$http_host:9011;
          proxy_set_header Origin           http://$host;
          proxy_set_header Host             $http_host:9011;
          proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
          proxy_set_header Upgrade          $http_upgrade;
          proxy_set_header Connection       $http_connection;
          proxy_http_version 1.1;
      }

在conf的底部

#####################################################################
#                                                                   #
#     Proxies for all the Other servers on other ports upstream     #
#                                                                   #
#####################################################################


#######################
#        Fusion       #
#######################

server {
    listen 9001 ssl;

#############  Lock it down  ################

# SSL certificate locations
    ssl_certificate /etc/letsencrypt/live/allineed.app/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/allineed.app/privkey.pem;

# Exclusions

    include snippets/exclusions.conf;

# Security

    include snippets/security.conf;
    include snippets/ssl.conf;

# Fastcgi cache rules

    include snippets/fastcgi-cache.conf;
    include snippets/limits.conf;
    include snippets/nginx-cloudflare.conf;

###########  Location upstream ##############

    location  ~ / {
        proxy_pass http://auth;
        proxy_set_header Origin           http://$host;
        proxy_set_header Host             $host:$server_port;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade          $http_upgrade;
        proxy_set_header Connection       $http_connection;
        proxy_http_version 1.1;
    }
        if (-d $request_filename) {
        rewrite [^/]$ $scheme://$http_host$uri/ permanent;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.