Estoy tratando de ejecutar múltiples contenedores acoplables, todos ejecutando nginx escuchando en el puerto 80, pero con diferentes puertos de host asignados al puerto de contenedores 80.
En su mayor parte, esto funciona, excepto cuando nginx realiza una redirección debido a la falta de una barra diagonal final.
server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}
Dada la configuración nginx anterior y un contenedor docker ejecutándolo con el puerto host 8080 asignado al puerto 80 del contenedor, puedo obtener localhost: 8080 / docs / via curl ok:
> GET /docs/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:27:05 GMT
< Content-Type: text/html
< Content-Length: 6431
< Last-Modified: Sat, 28 Nov 2015 17:17:06 GMT
< Connection: keep-alive
< ETag: "5659e192-191f"
< Accept-Ranges: bytes
<
... html page ...
pero si solicito localhost: 8080 / docs obtengo una redirección a localhost / docs /
> GET /docs HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:29:40 GMT
< Content-Type: text/html
< Content-Length: 184
< Location: http://localhost/docs/
< Connection: keep-alive
<
... html redirect page ...
¿Cómo puedo obtener nginx para preservar el puerto original al hacer la redirección? Intenté mirar port_in_redirect y server_name_in_redirect pero no me ayudaron.
EDITAR
Basado en https://forum.nginx.org/read.php?2,261216,261216#msg-261216, esto no parece posible en este momento.
Respuestas:
La solución más simple es eliminar la
index
directiva y no confiar en$uri/
redirecciones explícitas o implícitas . Por ejemplo:Este no es un comportamiento idéntico, ya que evita la redirección por completo. Si desea una redirección de barra diagonal como la que proporciona el módulo de índice, se requiere una solución más compleja. Por ejemplo:
fuente
Los clientes HTTP pondrán el puerto en el encabezado Host. Si utiliza el valor original del encabezado del host al hacer la redirección, debería funcionar como se esperaba. Probé el siguiente código y parece estar haciendo exactamente lo que solicitó:
fuente
Solo sigue esta simple solución
fuente
Interesante ... Encontré precisamente este problema y pude solucionarlo mucho como sugiere la respuesta de Richard Smith :
¿La única diferencia es que no especifico
index.html
?Especifique el código de error para evitar un bucle de redireccionamiento.
Todavía estoy esperando los comentarios del soporte de nginx.
fuente