Nginx: Nome do host do servidor correspondente na diretiva location

16

Eu tenho o nginx executando vários domínios em uma única diretiva de servidor, como

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

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

Agora, preciso usar a diretiva de localização para corresponder a um subdomínio e aplicar a autenticação básica a ele. O equivalente de

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

Como faço isso?

    
por Quintin Par 04.07.2011 / 16:23

4 respostas

15

Você pode usar uma expressão regular para capturar o subdomínio e usá-lo posteriormente em seu local.

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

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

Como alternativa, pode ser preferível mover todas as configurações comuns para um outro arquivo e, em seguida, criar blocos de servidores por subdomínio e incluir o arquivo externo.

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

    location / {
        ... 
    } 
}

(repita para outros servidores)

    
por 04.07.2011 / 16:43
6

Uma opção é retornar um erro e enviar esse erro para um local que manipule a autenticação 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;
}
    
por 17.01.2013 / 15:44
4

Você não precisa usar a diretiva location se usar o mapa. Esta é a solução mais simples e equivalente que eu posso pensar. Você pode nomear os arquivos htpasswd de acordo com seu $ http_host, por exemplo, 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;
}
    
por 07.03.2016 / 01:12
2

Se você tem vários (sub) domínios e eles não se comportam exatamente , então você usa vários servidores blcoks. Desculpe, mas essa é a melhor maneira, mesmo que você tenha uma configuração maior.

Você pode fazer um hack do gueto usando algo como if ($ http_host ~ foo), mas então você provavelmente vai se deparar com o comportamento imprevisível e estranho do if como documentado aqui: link

Não tente enganar o Nginx, apenas use as opções que ele oferece e você terá muito menos dores de cabeça.

    
por 04.07.2011 / 16:42

Tags