![NGINX: localhost redireccionando a _](https://rvso.com/image/782624/NGINX%3A%20localhost%20redireccionando%20a%20_.png)
Versión de nginx/1.18.0 (Ubuntu) — Ubuntu 22.04.01 LTS x86_64 kernel 6.0.8
Tengo un servidor (especificaciones de instalación anteriores) que tiene varios nombres de host, ejecuta nginx y todo funciona (incluido nginx, con redirecciones de http: a https:).
De hecho, así es como lo hago en mi servidor predeterminado:
listen 80 default_server;
listen 443 default_server ssl;
# force https-redirects
if ($scheme = http) {
return 301 https://$host$request_uri;
}
server_name _;
Aquí está el comportamiento extraño:
URL | Redirecciones a | Notas |
---|---|---|
http://mumblefrotz/ |
https://mumblefrotz/ |
(funciona como se esperaba) |
http://mumblefrotz.fullyqualified.com/ |
https://mumblefrotz.fullyqualified.com/ |
(funciona como se esperaba) |
http://127.0.0.1/ |
https://127.0.0.1/ |
(funciona como se esperaba) |
http://localhost/ |
https://_ |
FALLA |
¿Por qué hace esto? Sospecho que tiene algo que ver con elserver_name
La directiva se toma literalmente, aunque no estoy muy seguro de por qué solo ocurre con localhost
.
Al miraresta sugerencia de desbordamiento de pila, Intenté ambas cosas y aún así obtuve el sorprendente guión bajo:
server_name ~.;
server_name ~^(.+)$;
Mi expectativa es que $host
seael nombre de host pasado en la solicitud HTTP, con un host virtual recogiéndolo si se ha definido uno y recurriendo a la definición de servidor predeterminada si no.
Por lo que puedo decir http://localhost/
es el único que no se resuelve correctamente. Me gustaría arreglar eso.
Respuesta1
No hubo información sobre la pregunta de qué cliente se utilizó para realizar la solicitud. Como está escrito endocumentación nginx, $host
la variable contiene:
en este orden de precedencia: nombre de host de la línea de solicitud, o nombre de host del campo de encabezado de solicitud "Host", o el nombre del servidor que coincide con una solicitud
Aquí, "línea de solicitud" significa el nombre de host después GET
del verbo en la solicitud HTTP.
El segundo significa el Host
campo de encabezado.
El tercero significa el nombre configurado en server_name
.
En su caso, creo que el cliente de prueba realizó una solicitud que no contenía Host
encabezado. Por lo tanto, nginx usó la server_name
configuración para el contenido de $host
la variable.
Personalmente, solo genero el bloque de reenvío HTTP -> HTTPS para cada servidor virtual, ya que administro las configuraciones de nginx con Ansible. De esa manera puedo tener un return 404
vhost para todos los demás nombres de host que no me interesan.
Pero si necesita implementar un vhost común para las redirecciones, puede utilizar el siguiente enfoque:
map $http_host $redirect_host {
~ (^.+$) $http_host;
default example.com;
}
server {
listen 80 default_server;
...
if ($scheme = http) {
return 301 https://$redirect_host$request_uri;
}
}
Esto siempre utiliza el encabezado del host HTTP para el destino de redireccionamiento, excepto cuando no hay ningún Host
encabezado. En ese caso se utiliza example.com
para el objetivo de redireccionamiento. Puede asignar su nombre de dominio principal como destino de redireccionamiento, por ejemplo.