2012-02-26 11 views
68

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 passassero a un singolo index.php - Ho un sacco di domini e sottodomini e non è pratico elencarli tutti in una configurazione di nginx.nginx nome_server jolly o catch-all

Finora ho provato a impostare server_name su * ma non è riuscito come carattere jolly non valido. *.* funziona finché non aggiungo gli altri blocchi del server, quindi suppongo che sia in conflitto con loro.

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

N.B. Non sono uno spammer, questi sono veri e propri siti con contenuti utili, sono semplicemente alimentati dallo stesso CMS da un database!

risposta

101

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

listen  80 default_server; 

se si desidera inviare tutto a index.php se il file o la cartella non esiste;

try_files      $uri /$uri /index.php; 
+0

Ha funzionato perfettamente - molte grazie. Non potevo usare 'server_name _;' per la pagina di stato sull'indirizzo IP, dovevo specificare 'server_name x.x.x.x' ma va bene! – Tak

+0

L'aggiunta di 'default_server' non sembra funzionare su nginx 1.4.6 che è attualmente l'ultima versione su Ubuntu 14.04 ... Quando lo aggiungo, il comando' configtest' restituisce un errore, e il riavvio del server non funziona o. Ho provato la stessa configurazione sul mio server con Debian jessie, che ha nginx 1.6.2, e funziona perfettamente. Quindi prova un'altra versione se sei su 1.4.6 ... – Nicomak

+0

Side note per HTTPS: la direttiva '' 'default_server''' imposta anche il server che gestirà l'handshake SSL per le richieste su quella porta. Quindi, se si desidera che il blocco server A gestisca SSL, ma il server B funga da catchall per HTTPS, la soluzione è impostare '' 'server_name ~^(. +) $' '' Sul server B. – Luke

19

Ciò funzionerà:

server_name ~^(.+)$ 
+6

'nome_server ~ .' sembra essere più efficiente – zhangyoufu

+1

Questo ha funzionato per me. Per qualsiasi ragione non potrei far funzionare default_server, stava sovrascrivendo tutti i miei altri vhost. – NeuroXc

34

Un semplice sottolineatura funziona così:

server_name _; 

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

+0

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

+6

Il collegamento viene fornito come riferimento. Le due righe sopra in realtà sono la risposta: semplicemente mettendo un trattino basso come valore per nome_server produrrà il comportamento desiderato "cattura tutto". –

+25

Questa risposta non è vera. Il riferimento chiarisce che questo non funzionerà a meno che tu non abbia anche 'listen 80 default_server' nella tua configurazione. – Beetle

3

Per me in qualche modo definire default_server non funzionava. Ho risolto il problema con

server_name ~^.*$ 

utilizzando l'espressione regolare di tutti.

+0

Ho provato tutte le opzioni più votate e questa è l'unica che ha funzionato. NOTA: sto provando a raggiungere un server con il suo indirizzo IP e URL. – Mampersat

Problemi correlati