2015-07-17 15 views
24

mio file di configurazione ha un blocco server direttiva che inizia con ...

server { 
    server_name www.example1.com www.example2.com www.example3.com; 

... per consentire l'accesso al sito con diversi nomi di dominio.

Tuttavia PHP di $_SERVER['SERVER_NAME'] restituisce sempre la prima voce di server_name, in questo caso http://www.example1.com

Quindi non ho modo dal codice PHP per sapere quale dominio l'utente utilizzato per accedere al sito.

C'è un modo per dire a nginx/fastcgi di passare il nome di dominio reale utilizzato per accedere al sito?


L'unica soluzione che ho trovato finora è quello di ripetere l'intero server blocco per ogni dominio con un server_name ingresso distinto, ma, ovviamente, sto cercando uno migliore.

+1

forse utilizzare Host nel codice invece -http: //wiki.nginx.org/HttpCoreModule#.24host – edmondscommerce

+0

Perché non creare 3 file di configurazione del sito a nginx in \ etc \ nginx \ siti-disponibili per ogni sito che punta allo stesso percorso? –

+0

@maytham ovviamente posso farlo ma è esattamente quello che sto cercando di evitare (replicando file di configurazione identici) – Paolo

risposta

7

Questo è destinato e la soluzione corretta è utilizzare $_SERVER['HTTP_HOST'] nel codice invece.

Si dovrebbe interpretare SERVER_NAME come verificato server-name, e HTTP_HOST come input degli utenti che possono essere modificati facilmente, e quindi non dovrebbe essere attendibile.

+0

grazie. Questa è la soluzione più semplice e probabilmente ci andrò. Comunque avrei preferito trovare un modo per usare ''SERVER_NAME'' dato che è il nome dell'host virtuale in quanto viene definito come ** nginx ** gestisce la richiesta applicando le direttive di configurazione. "HTTP_HOST" viene direttamente dall'intestazione della richiesta (se il client lo ha inviato). Ovviamente un ** nginx ** correttamente configurato rigetterebbe le richieste con intestazioni host HTTP sbagliate rendendo ''HTTP_HOST'' affidabile ... – Paolo

+0

Capisco che stai tentando una sorta di convalida parziale nella tua configurazione di nginx; ma come hai detto tu, un nginx configurato correttamente permetterà solo voci * HTTP_HOST valide *. Trattare HTTP_ * come non attendibile come altri input dell'utente è ancora una buona idea. La distinzione tra 'SERVER_NAME' e' HTTP_HOST' è molto utile se capisci la differenza – Sjon