如何使用nginx proxy_pass保留请求URL

时间:2011-04-29 15:28:54

标签: ruby proxy nginx thin unicorn

我尝试使用Thin应用服务器并遇到一个问题。

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

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

nginx'doc说:

  

如果需要传输URI   未处理的表格然后指令   应该在没有URI的情况下使用proxy_pass   一部分。

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

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

那么请你帮我弄清楚如何从客户端保留原始请求网址

8 个答案:

答案 0 :(得分:104)

我认为proxy_set_header指令可以提供帮助:

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

答案 1 :(得分:10)

只需 proxy_set_header主机$ 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;

答案 2 :(得分:3)

完全转发,而不会切断请求的absoluteURI和标题中的Host

server {
    listen 35005;

    location / {
        rewrite            ^(.*)$   "://$http_host$uri$is_args$args";
        rewrite            ^(.*)$   "http$uri$is_args$args" break;
        proxy_set_header   Host     $host;

        proxy_pass         https://deploy.org.local:35005;
    }
}

在此处找到:https://opensysnotes.wordpress.com/2016/11/17/nginx-proxy_pass-with-absolute-url/

答案 3 :(得分:3)

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

所以你只需要这样做:

export const Hover = ({ onHover, children }) => (
  <div className="hover">
    <div className="hover__no-hover">{children}</div>
    <div className="hover__hover">{onHover}</div>
  </div>
)

const App = () => (
  <div style={styles}>
    <Hover onHover={<div> Show this on hover </div>}>
      <div> Show on no hover </div>
    </Hover>
  </div>
);

答案 4 :(得分:1)

在我的场景中,我通过nginx vhost配置中的以下代码进行了此操作

server {
server_name dashboards.etilize.com;

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

  

请其他人注意以下事项:解决方案的核心   nginx不操纵URL,是在末尾删除斜杠   复制:proxy_pass指令。 http://my_app_upstream与   http://my_app_upstream/ –雨果·约瑟夫森

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

答案 7 :(得分:-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;
    }
}