Nginx:ロケーションディレクティブの一致するサーバーホスト名


18

私は単一のサーバーディレクティブの下で複数のドメインを実行しているnginxを持っています

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

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

次に、locationディレクティブを使用してサブドメインを照合し、基本認証を適用する必要があります。と同等

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

どうすればいいですか?

回答:


16

正規表現を使用してサブドメインをキャプチャし、後で自分の場所で使用できます。

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

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

または、すべての一般的な構成を他のファイルに移動してから、サブドメインごとにサーバーブロックを作成し、外部ファイルを含めることをお勧めします。

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

    location / {
        ... 
    } 
}

(他のサーバーに対して繰り返し)


私は何かを見逃していますか、またはサーバー名の行に?andがあり<>ませんか?私はそれがあるべきだと思うserver_name ~^(?<sub>\.)?(?<domain>.+)$;
モハマドアブシャディ

あなたはおそらく正しいでしょう-それが今のようになっている理由は考えられませんので、あなたの提案に変更しました。
cyberx86

6

1つのオプションは、エラーを返し、そのエラーを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

mapを使用する場合、locationディレクティブを使用する必要はありません。これは私が考えることができる最も簡単なソリューションと同等です。htpasswdファイルには、たとえば$ http_hostに従って名前を付けることができます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
魅力のように機能します。
conradkleinespel

@Tom Siwikとにかくこれを調整して、IP制限をallow/ denyで同様に実施できますか?
トースト

可能であれば、多くの変数をマッピングできます。変数のリストについては、nginx.org / en / docs / varindex.htmlを参照してください。おそらくの$remote_addr代わりに必要になり$http_hostます。ただし、範囲についてはわかりません。
トムシウィック

4

複数の(サブ)ドメインがあり、それらがまったく同じように動作しない場合は、複数のサーバーblcoksを使用します。申し訳ありませんが、構成が大きくなっても、それが真剣に最善の方法です。

if($ http_host〜foo)のようなものを使用してゲットーハックを行うことができますが、ここで説明されているように、ifの予測不可能で奇妙な振る舞いを妨害する可能性が高くなります:http ://wiki.nginx.org/IfIsEvil

Nginxを出し抜こうとしないでください。それが提供するオプションを使用するだけで、頭痛がはるかに少なくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.