proxy_ssl_server_name proxy_pass proxy_hide_header proxy_cache_lock_timeout nginx

nginx - proxy_pass - proxy redirect default



Cambiar el encabezado del host en el proxy inverso nginx (4)

Estoy ejecutando nginx como proxy inverso para el sitio example.com para equilibrar la carga de una aplicación ruby ​​que se ejecuta en el servidor backend. Tengo el siguiente campo proxy_set_header en nginx que pasará los encabezados del host a back-end ruby. Esto es requerido por la aplicación ruby ​​para identificar los nombres de subdominios.

location / { proxy_pass http://rubyapp.com; proxy_set_header Host $http_host; }

Ahora quiero crear un alias beta.example.com , pero el encabezado del host pasado al backend debería ser www.example.com contrario la aplicación ruby ​​rechazará las solicitudes. Así que quiero algo similar a debajo de la directiva de ubicación.

if ($http_host = "beta.example.com") { proxy_pass http://rubyapp.com; proxy_set_header Host www.example.com; }

¿Cuál es la mejor manera de hacer esto?


Estaba tratando de resolver la misma situación, pero con uwsgi_pass .

Después de algunas investigaciones, descubrí que, en este escenario, es necesario:

uwsgi_param HTTP_HOST $my_host;

Espero que ayude a alguien más.


No puede usar proxy_pass en el bloque if, por lo que sugiero hacer algo como esto antes de configurar el encabezado de proxy:

set $my_host $http_host; if ($http_host = "beta.example.com") { set $my_host "www.example.com"; }

Y ahora solo puede usar proxy_pass y proxy_set_header sin el bloque if:

location / { proxy_pass http://rubyapp.com; proxy_set_header Host $my_host; }


Sólo un pequeño consejo. A veces es posible que necesite usar X-Forwarded-Host en lugar del encabezado de Host . Ese fue mi caso donde el encabezado del Host funcionó, pero solo para el puerto HTTP estándar 80. Si la aplicación se expuso en un puerto no estándar, este puerto se perdió cuando la aplicación generó redirecciones. Así que finalmente lo que funcionó para mí fue:

proxy_set_header X-Forwarded-Host $http_host;


map es mejor que el set + if.

map $http_host $served_host { default $http_host; beta.example.com www.example.com; } server { [...] location / { proxy_pass http://rubyapp.com; proxy_set_header Host $served_host; } }