如何保存请求的网址与 nginx 代理_pass

我试图使用 应用程序服务器,有一个问题。

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

我想要的是传递的原始 URL 和原始请求从客户端没有修改,因为应用程序严重依赖于它。

Nginx 的 医生表示:

如果需要在 未处理的表单 then 指令 Xy _ pass 应该不带 URI 使用 一部分。

但是我不知道如何确切地配置它,因为相关的示例实际上使用了 URI:

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

所以你能帮我从客户那里弄清楚如何使用 保留原始请求 URL吗?

176874 次浏览

I think the proxy_set_header directive could help:

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

Just proxy_set_header Host $host miss port for my case. Solved by:




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


and then in the 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;


To perfectly forward without chopping the absoluteURI of the request and the Host in the header:

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;
}
}

Found here: https://opensysnotes.wordpress.com/2016/11/17/nginx-proxy_pass-with-absolute-url/

nginx also provides the $http_host variable which will pass the port for you. its a concatenation of host and port.

So u just need to do:

proxy_set_header Host $http_host;

In my scenario i have make this via below code in nginx vhost configuration

server {
server_name dashboards.etilize.com;


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

$http_host will set URL in Header same as requested

In case something modifies the location that you're trying to serve, e.g. try_files, this preserves the request for the back-end:

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

for my auth server... this works. i like to have options for /auth for my own humanized readability... or also i have it configured by port/upstream for machine to machine.

.

at the beginning of conf

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

Inside my 443 server block

          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;
}

At the bottom of 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;
}
}

Note to other people finding this: The heart of the solution to make nginx not manipulate the URL, is to remove the slash at the end of the Copy: proxy_pass directive. http://my_app_upstream vs http://my_app_upstream/ – Hugo Josefson

I found this above in the comments but I think it really should be an answer.