Nginx: відповідне ім'я хоста сервера в директиві про місцезнаходження


18

У мене nginx працює з декількома доменами відповідно до однієї директиви сервера як

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

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

Тепер мені потрібно використовувати директиву про місцезнаходження, щоб відповідати субдомену та застосувати до нього базовий auth. Еквівалент

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 / {
        ... 
    } 
}

(повторити для інших серверів)


Я щось пропускаю або в рядку імені сервера відсутнє a ?і <>? Я вважаю, що так має бутиserver_name ~^(?<sub>\.)?(?<domain>.+)$;
Мохаммед АбуШаді

Ви, напевно, правильні - я не можу придумати будь-якої причини, якою вона була в даний момент, тому я змінив це на вашу пропозицію.
cyberx86

6

Один із варіантів - повернути помилку та надіслати цю помилку до місця, де обробляється 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

Якщо ви використовуєте карту, вам не потрібно використовувати директиву про місцезнаходження. Це найпростіше рішення та рівнозначне, що я можу придумати. Ви можете назвати файли 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), але тоді, швидше за все, ви зіткнетеся з непередбачуваною і дивною поведінкою, якщо це задокументовано тут: http://wiki.nginx.org/IfIsEvil

Не намагайтеся перехитрити Nginx, просто використовуйте варіанти, які він вам дає, і у вас буде набагато менше головних болів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.