nginx nombre_servidor comodín o catch-all

118

Tengo una instancia de nginx en ejecución que sirve a varios sitios web. El primero es un mensaje de estado en la dirección IP del servidor. El segundo es una consola de administración encendida admin.domain.com. Estos funcionan muy bien. Ahora me gustaría que todas las demás solicitudes de dominio vayan a una sola index.php: tengo muchos dominios y subdominios y no es práctico enumerarlos todos en una configuración nginx.

Hasta ahora he intentado fijar server_namea *, pero que falló como un comodín válido. *.*funciona hasta que agrego los otros bloques de servidor, entonces supongo que entra en conflicto con ellos.

¿Hay alguna manera de ejecutar un bloque de servidor catch-all en nginx después de que se hayan definido otros sitios?

NB No soy un spammer, estos son sitios genuinos con contenido útil, ¡simplemente funcionan con el mismo CMS de una base de datos!

Tak
fuente
1
Es mejor usar esto como fuente principal nginx.org/en/docs/http/server_names.html
stephen

Respuestas:

147

Cambie la opción de escuchar a esto en su bloque de servidor catch-all. (Agregar default_server) esto tomará todas sus conexiones no definidas (en el puerto especificado).

listen       80  default_server;

si desea enviar todo a index.php si el archivo o carpeta no existe;

try_files                       $uri /$uri /index.php;
Mattias
fuente
Funcionó perfectamente, muchas gracias. No pude usar server_name _;para la página de estado en la dirección IP, tuve que especificar, ¡ server_name x.x.x.xpero está bien!
Tak
1
Agregar default_serverno parece funcionar en nginx 1.4.6, que es actualmente la última versión en Ubuntu 14.04 ... Cuando lo agrego, el configtestcomando devuelve un error y reiniciar el servidor tampoco funciona. Probé exactamente la misma configuración en mi servidor con Debian jessie, que tiene nginx 1.6.2, y funciona perfectamente. Así que prueba otra versión si estás en 1.4.6 ...
Nicomak
1
Nota al margen para HTTPS: la default_serverdirectiva también establece el servidor que manejará el protocolo de enlace SSL para las solicitudes en ese puerto. Por lo tanto, si desea que el bloque de servidor A maneje SSL, pero el servidor B actúe como el receptor de HTTPS, la solución es configurarlo server_name ~^(.+)$en el servidor B.
Lucas
66

Un guión bajo simple también funciona:

server_name  _;

Fuente: http://nginx.org/en/docs/http/server_names.html

jp.gouigoux
fuente
2
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si cambia la página enlazada.
Kmeixner
10
El enlace solo se proporciona como referencia. Las dos líneas de arriba son en realidad la respuesta: simplemente poner un guión bajo como valor para server_name producirá el comportamiento deseado de "captura todo".
jp.gouigoux
55
Esta respuesta no es cierta. La referencia deja en claro que esto no funcionará a menos que también tenga listen 80 default_serveren su configuración.
Escarabajo
5
Consulte también este artículo .
Escarabajo
2
Tal vez no entendí bien los documentos, pero "No hay nada especial en este nombre, es solo uno de una miríada de nombres de dominio no válidos que nunca se cruzan con ningún nombre real. Otros nombres no válidos como“ - ”y“! @ # ”Pueden igualmente ser utilizado. ". Entonces, ¿ _es solo un nombre inválido ?
Florian Klein
26

Esto funcionará:

server_name ~^(.+)$
comonitos
fuente
13
server_name ~.parece ser más eficiente
youfu
2
Esto funcionó para mí. Por alguna razón, no pude hacer que default_server funcionara, estaba anulando todos mis otros vhosts.
NeuroXc
11

Para mí, de alguna manera, definir default_server no estaba funcionando. Lo resolví por

server_name ~^.*$

usando la expresión regular de todos.

Ashish
fuente
Probé todas las opciones con más votos y esta es la única que funcionó. NOTA: Estoy intentando acceder a un servidor con su dirección IP frente a URL.
Mampersat
9

Solo 1 serverdirectiva

De Nginx listenDocs

El parámetro default_server, si está presente, hará que el servidor se convierta en el servidor predeterminado para la dirección especificada: par de puertos. Si ninguna de las directivas tiene el parámetro default_server, el primer servidor con el par dirección: puerto será el servidor predeterminado para este par.

Si solo tiene 1 serverdirectiva, eso manejará todas las solicitudes, no necesita configurar nada.


serverDirectiva múltiple

Si desea hacer coincidir todas las solicitudes con la serverdirectiva especificada , simplemente agregue el default_serverparámetro a listen, Nginx usará esta serverdirectiva como predeterminada.

server {
    listen 80 default_server;
}

Acerca de server_name _;

De Nginx Docs

En los ejemplos de servidor general, se puede ver el nombre extraño "_":

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

No hay nada especial en este nombre, es solo uno de una miríada de nombres de dominio inválidos que nunca se cruzan con ningún nombre real. También se pueden usar otros nombres no válidos como “-” y “! @ #”.

No importa lo server_nameque establezca, es solo un nombre de dominio no válido .

Ala de acero
fuente
2

Si también desea capturar solicitudes con Hostencabezado vacío (que está permitido en HTTP / 1.0 ), puede usar expresiones regulares y vacías server_name:

server {
    listen      80;
    server_name ~. "";
}
Pavel Golubev
fuente