Opened 6 years ago
Closed 6 years ago
#1608 closed defect (invalid)
$proxy_port is empty if proxy_pass specified using upstream
Reported by: | AnrDaemon | Owned by: | |
---|---|---|---|
Priority: | minor | Milestone: | |
Component: | other | Version: | 1.14.x |
Keywords: | proxy | Cc: | |
uname -a: | Linux hosting64 4.4.0-130-generic #156~14.04.1-Ubuntu SMP Thu Jun 14 13:51:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux | ||
nginx -V: |
nginx version: nginx/1.14.0
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4) built with OpenSSL 1.0.1f 6 Jan 2014 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' |
Description
Test with
curl --connect-to ::yourhost: --head http://myserver/works
curl --connect-to ::yourhost: --head http://myserver/not
upstream myproxy { server 127.0.0.1:8011; } server { listen 80; server_name myserver; proxy_set_header Host $host; location /works { proxy_pass http://127.0.0.1:8011/; proxy_redirect default; proxy_redirect "http://$host:$proxy_port/" "$scheme://$host/"; } location /not { proxy_pass http://myproxy/; proxy_redirect default; proxy_redirect "http://$host:$proxy_port/" "$scheme://$host/"; } } server { listen 8011; server_name myserver; return 301 $scheme://$server_name:$server_port/; }
Note:
See TracTickets
for help on using tickets.
The
$proxy_port
variable is expected to contain port as written in theproxy_pass
directive or the default port for the protocol, see docs. In this particular case,$proxy_port
will be80
as there is no port specified in theproxy_pass
. It is not expected to be anyhow influenced with what is written in the upstream block.This is because upstream blocks are more sophisticated replacement for name resolution. Much like name resolution, they assume identical servers to be listed, and assume these servers accept identical requests and return identical responses. No per-server differentiation is provided.
If your backend servers are instead different and return different redirects, consider using multiple
proxy_redirect
directives and/or writing regular expressions appropriate for your case. Alternatively, consider reconfiguring your backend servers to return indentical responses.