Red de conocimiento informático - Aprendizaje de programación - Manejo de la pérdida del puerto de redireccionamiento en Nginx

Manejo de la pérdida del puerto de redireccionamiento en Nginx

A veces, nginx no es tan inteligente como Apache y maneja las ubicaciones de redireccionamiento particularmente mal, lo que deja a los usuarios prácticamente obligados a lidiar manualmente con puertos no estándar.

Por ejemplo, si por alguna razón, nginx no está escuchando en el puerto 80, o si las solicitudes externas se envían a nginx a través de NAT, y la dirección externa no es un puerto http(s) estándar, nginx no funciona bien Maneje estas redirecciones apropiadamente. Cuando se produce la redirección, el puerto se pierde.

Por ejemplo, los siguientes dos ejemplos de referencia:

Las solicitudes del navegador encontrarán que cada vez que ocurre una redirección, el número de puerto se pierde, lo que hace que el navegador acceda al puerto incorrecto.

Se dan soluciones para estas dos situaciones.

Este problema es fácil de resolver, porque hay muchos proxy_set_headers circulando en Internet y casi todos los documentos nacionales y extranjeros sin excepción tienen este aspecto. Más tarde descubrí que gitlab-ce no tenía problemas para acceder a puertos no estándar, así que verifiqué la configuración nginx de gitlab-ce y descubrí que estaba configurada así:

También encontré la configuración publicada por el archivo del paquete de software nginx y descubrí que en realidad hace referencia al archivo /etc/nginx/proxy_params <

También dice proxy_set_header Host $http_host;, por lo que solo necesita incluirlo

Si no tiene este archivo, puede escribir directamente el contenido del archivo en la sección de ubicación manualmente.

Echemos un vistazo a la documentación oficial. En realidad menciona:

Esto es más problemático, por ejemplo, el archivo data/index.html existe en $document_root, pero /data. se utiliza al acceder a él. El / final no se agrega para indicar que está accediendo a un directorio, y el servidor realizará una redirección 301 movida permanentemente en este momento. La redirección permanente redirigirá permanentemente el servidor, pero no siempre. Si nginx está escuchando en un puerto no estándar, la ubicación devuelta por 301 no tendrá un número de puerto, lo que provocará que la solicitud del navegador salga mal.

Puedes ver esto claramente con curl:

Puedes ver claramente que la Ubicación no tiene un número de puerto y esta redirección es diferente de un proxy inverso. Así que busqué en Google y finalmente encontré la solución en una sesión de preguntas y respuestas de Stackoverflow:

El problema se resolvió configurando la reescritura de URL para incluir el número de puerto.

El problema se resolvió configurando la reescritura de URL para incluir el número de puerto.