nginx nome_server carattere jolly o catch-all


119

Ho un'istanza di nginx in esecuzione che serve diversi siti Web. Il primo è un messaggio di stato sull'indirizzo IP del server. Il secondo è una console di amministrazione su admin.domain.com. Questi funzionano alla grande. Ora vorrei che tutte le altre richieste di dominio andassero a un singolo index.php: ho un sacco di domini e sottodomini ed è poco pratico elencarli tutti in una configurazione nginx.

Finora ho provato a installare server_namea *, ma che non è riuscita come un jolly valido. *.*funziona fino a quando non aggiungo gli altri blocchi del server, quindi immagino che sia in conflitto con loro.

C'è un modo per eseguire un blocco server catch-all in nginx dopo che altri siti sono stati definiti?

NB Non sono uno spammer, questi sono siti autentici con contenuti utili, sono semplicemente alimentati dallo stesso CMS da un database!


1
Meglio usarlo come fonte primaria nginx.org/en/docs/http/server_names.html
stephen

Risposte:


147

Cambia l'opzione di ascolto in questo nel tuo blocco server catch-all. (Aggiungi default_server) questo richiederà tutte le connessioni non definite (sulla porta specificata).

listen       80  default_server;

se vuoi spingere tutto su index.php se il file o la cartella non esiste;

try_files                       $uri /$uri /index.php;

Ha funzionato perfettamente - molte grazie. Non potevo usare server_name _;la pagina di stato sull'indirizzo IP, dovevo specificarlo server_name x.x.x.xma va bene così!
Tak il

1
L'aggiunta default_servernon sembra funzionare su nginx 1.4.6 che è attualmente l'ultima versione su Ubuntu 14.04 ... Quando lo aggiungo, il configtestcomando restituisce un errore e nemmeno il riavvio del server funziona. Ho provato la stessa identica configurazione sul mio server con Debian jessie, che ha nginx 1.6.2, e funziona perfettamente. Quindi prova un'altra versione se sei sulla 1.4.6 ...
Nicomak

1
Nota a margine per HTTPS: la default_serverdirettiva imposta anche il server che gestirà l'handshake SSL per le richieste su quella porta. Quindi, se vuoi che il blocco del server A gestisca SSL, ma il server B agisca come catchall per HTTPS, la soluzione è impostarla server_name ~^(.+)$sul server B.
Luca

66

Funziona anche un semplice trattino basso:

server_name  _;

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


2
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere le parti essenziali della risposta qui e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Kmeixner

10
Il collegamento è fornito solo come riferimento. Le due righe sopra in realtà sono la risposta: semplicemente mettendo un trattino basso come valore per nome_server produrrà il comportamento "catch all" desiderato.
jp.gouigoux

55
Questa risposta non è vera. Il riferimento rende chiaro che questo non funzionerà a meno che tu non abbia anche listen 80 default_servernella tua configurazione.
Maggiolino

5
Vedi anche questo articolo .
Maggiolino

2
Forse ho frainteso i documenti, ma "Non c'è niente di speciale in questo nome, è solo uno di una miriade di nomi di dominio non validi che non si intersecano mai con un nome reale. Altri nomi non validi come" - "e"! @ # "Possono ugualmente essere utilizzato. ". Quindi _è solo un nome non valido ?
Florian Klein

26

Questo funzionerà:

server_name ~^(.+)$

13
server_name ~.sembra essere più efficiente
youfu

2
Questo ha funzionato per me. Per qualsiasi motivo non sono riuscito a far funzionare default_server, stava sovrascrivendo tutti i miei altri vhost.
NeuroXc

11

Per me in qualche modo definire default_server non funzionava. L'ho risolto da

server_name ~^.*$

usando l'espressione regolare di tutti.


Ho provato tutte le opzioni con voti più alti e questa è l'unica che ha funzionato. NOTA: sto cercando di accedere a un server con il suo indirizzo IP e l'URL.
Mampersat

9

Solo 1 serverdirettiva

Da Nginx listenDocs

Il parametro default_server, se presente, farà sì che il server diventi il ​​server predefinito per l'indirizzo specificato: coppia di porte. Se nessuna delle direttive ha il parametro default_server, il primo server con la coppia address: port sarà il server predefinito per questa coppia.

Se hai solo 1 serverdirettiva, che gestirà tutte le richieste, non è necessario impostare nulla.


serverDirettive multiple

Se vuoi abbinare tutte le richieste con la serverdirettiva specificata , aggiungi semplicemente un default_serverparametro a listen, Nginx userà questa serverdirettiva come impostazione predefinita.

server {
    listen 80 default_server;
}

Di server_name _;

Da Nginx Docs

Negli esempi di server catch-all si può vedere lo strano nome "_":

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

Non c'è niente di speciale in questo nome, è solo uno di una miriade di nomi di dominio non validi che non si intersecano mai con nessun nome reale. Altri nomi non validi come "-" e "! @ #" Possono essere ugualmente utilizzati.

Non importa cosa server_nameimposti, è solo un nome di dominio non valido .



2

Se vuoi anche catturare le richieste con Hostun'intestazione vuota (che è consentita in HTTP / 1.0 ) puoi usare sia regex che vuoto server_name:

server {
    listen      80;
    server_name ~. "";
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.