Nginx: corrispondente nome host del server nella direttiva posizione


18

Ho nginx in esecuzione su più domini con una sola direttiva server come

server {
        listen       80;
        server_name  www.domain.com;
        server_name  x.domain.com;
        server_name  y.domain.com;

----
----
----
}

Ora, devo usare la direttiva di localizzazione per abbinare un sottodominio e applicare l'autent di base ad esso. L'equivalente di

location x.domain.com {
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/.htpasswd;
}

Come faccio a fare questo?

Risposte:


16

È possibile utilizzare un'espressione regolare per acquisire il sottodominio e utilizzarlo successivamente nella propria posizione.

server {
    server_name   ~^(?<sub>\.)?(?<domain>.+)$;

    location / {
        root   /sites/$sub;
    }
}

In alternativa, potrebbe essere preferibile spostare tutte le configurazioni comuni in un altro file, quindi creare blocchi server per sottodominio e includere il file esterno.

server {
        server_name  www.domain.com;
        include /etc/nginx/sites-enabled/default.inc;

    location / {
        ... 
    } 
}

(ripetere per altri server)


Mi manca qualcosa o nella riga del nome del server manca un ?e <>? Credo che dovrebbe essereserver_name ~^(?<sub>\.)?(?<domain>.+)$;
Mohammad AbuShady,

Probabilmente hai ragione: non riesco a pensare a nessuna ragione per cui sia così com'era in quel momento, quindi l'ho modificato secondo il tuo suggerimento.
cyberx86,

6

Un'opzione è di restituire un errore e inviarlo a un percorso che gestisce l'autenticazione HTTP:

if ($host = x.domain.com) {
    return 550;
}

error_page 550 = @xauth;

location @xauth {
    auth_basic "Admin Login";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

5

Non è necessario utilizzare la direttiva posizione se si utilizza map. Questa è la soluzione più semplice ed equivalente che mi viene in mente. Puoi nominare i file htpasswd secondo il tuo $ http_host ad es x.domain.com.htpasswd.

map $http_host $auth_type {
    default "off";               #This will turn off auth-basic
    x.domain.com "Restricted";   #This or any other string will turn it back on
}

server {
    auth_basic $auth_type;
    auth_basic_user_file /etc/nginx/conf.d/$http_host.htpasswd;
}

1
Funziona come un fascino.
Conradkleinespel,

@Tom Siwik Ad ogni modo posso aggiustarlo per imporre restrizioni IP con allow/ denyallo stesso modo?
brindare il

Dovrebbe essere possibile, è possibile mappare su molte variabili. Vedi: nginx.org/en/docs/varindex.html per un elenco di variabili. Probabilmente avrai bisogno $remote_addrinvece di $http_host. Non sono sicuro delle gamme però.
Tom Siwik,

4

Se hai più (sotto) domini e non si comportano esattamente allo stesso modo, allora usi più server blcok. Siamo spiacenti ma è davvero il modo migliore, anche se avrai una configurazione più ampia.

Puoi fare un hack del ghetto usando qualcosa come if ($ http_host ~ foo) ma molto probabilmente ti imbatterai nel comportamento imprevedibile e strano di come documentato qui: http://wiki.nginx.org/IfIsEvil

Non cercare di superare in astuzia Nginx, usa solo le opzioni che ti offre e avrai molto meno mal di testa.

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.