Nginx: Konum yönergesinde eşleşen sunucu ana bilgisayar adı


18

Tek bir sunucu yönergesi altında birden çok etki alanı çalışan nginx var

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

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

Şimdi, bir alt alanla eşleşmek ve buna temel kimlik doğrulaması uygulamak için konum yönergesini kullanmam gerekiyor. Eşdeğeri

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

Bunu nasıl yaparım?

Yanıtlar:


16

Alt etki alanını yakalamak için normal bir ifade kullanabilir ve daha sonra bunu bulunduğunuz yerde daha sonra kullanabilirsiniz.

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

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

Alternatif olarak, tüm yaygın yapılandırmaları başka bir dosyaya taşımak ve ardından alt alan adı başına sunucu blokları oluşturmak ve harici dosyayı dahil etmek tercih edilebilir.

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

    location / {
        ... 
    } 
}

(diğer sunucular için tekrarlayın)


Bir şey eksik mi veya sunucu adı satırında bir ?ve eksik <>? Olması gerektiğine inanıyorumserver_name ~^(?<sub>\.)?(?<domain>.+)$;
Mohammad AbuShady

Muhtemelen haklısınız - şu anda olduğu gibi herhangi bir sebep düşünemiyorum, bu yüzden öneriniz olarak değiştirdim.
cyberx86

6

Bir seçenek, bir hata döndürmek ve bu hatayı HTTP kimlik doğrulamasını işleyen bir konuma göndermektir:

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

Harita kullanıyorsanız konum yönergesini kullanmanıza gerek yoktur. Bu aklıma gelen en basit çözüm ve eşdeğerdir. Htpasswd dosyalarını $ http_host ör 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
Tıkır tıkır çalışıyor.
conradkleinespel

@Tom Siwik Yine de IP kısıtlamalarını allow/ denyile aynı şekilde uygulamak için bunu ayarlayabilir miyim ?
tost

Mümkün olması halinde, çok sayıda değişkeni eşleyebilirsiniz. Değişkenlerin listesi için nginx.org/tr/docs/varindex.html adresine bakın . Bunun $remote_addryerine muhtemelen ihtiyacınız olacak $http_host. Aralıkları hakkında emin değilim.
Tom Siwik

4

Birden çok (alt) alanınız varsa ve bunlar tam olarak aynı şekilde davranmıyorsa, birden çok sunucu blcoks kullanırsınız. Üzgünüz, ancak daha büyük bir yapılandırmaya sahip olsanız bile, bu en iyi yoldur.

İf ($ http_host ~ foo) gibi bir şey kullanarak bir getto kesmek yapabilirsiniz, ancak büyük olasılıkla burada belgelendiği şekliyle öngörülemeyen ve garip davranışı hakkında bilgi sahibi olursunuz: http://wiki.nginx.org/IfIsEvil

Nginx'i alt etmeye çalışmayın, sadece size sunduğu seçenekleri kullanın ve çok daha az baş ağrınız olacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.