Las redirecciones Nginx Proxy/Upstream utilizan un puerto y protocolo incorrectos

Las redirecciones Nginx Proxy/Upstream utilizan un puerto y protocolo incorrectos

Estoy usando un servidor NGINX como proxy SSL para algunos otros servidores NGINX. Desafortunadamente, si un servidor ascendente redirige una solicitud, el campo de ubicación contiene el puerto de destino incorrecto.

curl -v "https://example.com/site":

> GET /site HTTP/2
> Host: example.com
> User-Agent: curl/7.58.0
> Accept: */*
> 
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 301 
< server: nginx
< date: Sun, 18 Mar 2018 20:01:44 GMT
< content-type: text/html
< content-length: 178
< location: http://example.com:9101/site/
< strict-transport-security: max-age=15768000; includeSubDomains

Proxy NGINX:

# Proxy: example.com
####################

server {
  listen 0.0.0.0:80;
  listen [::]:80;
  server_name example.com;
  root /srv/www/_empty;
  location / { return 301 https://example.com$request_uri; }
}

upstream myupstream {
  server [::1]:9101;
}

server {
  listen 0.0.0.0:443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  root /srv/www/_empty;

  location / {

    proxy_set_header    Host                   $http_host;
    proxy_set_header    X-Real-IP              $remote_addr;
    proxy_set_header    X-Forwarded-For        $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto      $scheme;
    proxy_set_header    X-Frame-Options        "";
    proxy_set_header    X-Content-Type-Options "";
    proxy_pass          http://myupstream;
  }
}

Servidor ascendente NGINX:

# NGINX Site: example.com
#########################

server {
  # Server
  listen [::1]:9101;
  server_name example.com;

  # Root
  root /srv/www/example.com/staging;

  # Disable Caching
  sendfile off;

  # Charset
  charset utf-8;

  # Default
  location / {
    index index.html;
    try_files $uri $uri/ =404;
  }
}

Ambas instancias de NGINX se ejecutan como procesos maestros separados en la misma máquina. Todo lo demás funciona perfectamente.

Pensé que NGINX Proxy reescribiría la respuesta ascendente para que se convirtiera http://example.com:9001/site/a https://example.com/site/.

¿Qué me olvidé?

Respuesta1

proxy_redirect defaultno funcionará de la manera esperada porque está utilizando un upstreambloque y nginxno puede obtener la cadena requerida de la proxy_passdeclaración. Puedes especificarlo explícitamente con:

proxy_redirect http://example.com:9101/ /;

Vereste documentopara más.


Alternativamente, dígale a suservidor ascendentedejar de especificar un puerto en sus respuestas de redirección con:

port_in_redirect off;

Vereste documentopara más.

información relacionada