Opened 2 years ago

Closed 2 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/;
}

Change History (1)

comment:1 by Maxim Dounin, 2 years ago

Resolution: invalid
Status: newclosed

The $proxy_port variable is expected to contain port as written in the proxy_pass directive or the default port for the protocol, see docs. In this particular case, $proxy_port will be 80 as there is no port specified in the proxy_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.

Note: See TracTickets for help on using tickets.