Назад | Перейти на главную страницу

Несколько защищенных локаций с Nginx

Я пытаюсь защитить пару мест, используя базовую HTTP-аутентификацию, которая поставляется с Nginx, но по какой-то причине это не сработает.

У меня есть:

website.com/admin (доступно для пользователя ADMIN) website.com/admin/secret.php (доступно только для пользователя SECRET)

Раньше он работал в Lighttpd:

"/admin/secret.php" => (
    "method"  => "basic",
    "realm"   => "Server Administrator",
    "require" => "user=SECRET"
    ),

"/admin" => (
    "method"  => "basic",
    "realm"   => "Administrators",
    "require" => "user=ADMIN"
    )

Любые идеи, как это можно преобразовать в Nginx. Я пробовал следующее, но только ADMIN запросит пароль:

location /admin/secret.php {
    auth_basic "Restricted";
    auth_basic_user_file /home/passwords/SECRET;
    try_files $uri = 404;
    fastcgi_pass localhost:9000;
    }

location ^~ /admin/.+\.php$ {
    auth_basic "Restricted";
    auth_basic_user_file /home/passwords/ADMIN;
    try_files $uri = 404;
    fastcgi_pass localhost:9000;
    }

Правила Nginx для обработки местоположений следующие: он перечисляет все обычные местоположения и находит наиболее точное совпадение (Nginx сортирует все обычные местоположения для оптимизации этого шага). После этого Nginx запускает все локации "regexp" в порядке их появления. Если какое-либо местоположение "regexp" выполнено успешно, Nginx будет использовать это первое совпадение. Если местоположение "regexp" не удалось, Nginx использует обычное местоположение, найденное на предыдущем шаге.

В вашем случае, поскольку местоположения "regexp" имеют приоритет над местоположениями "префиксов", поэтому ваши /admin/.+\.php$ выбран для обработки запроса /admin/secret.php.

Можно запретить поиск местоположений регулярных выражений, используя ^~ модификатор или укажите точное совпадение с помощью = модификатор:

location = /admin/secret.php { ...

Заметка Я только что заметил неправильный фрагмент конфигурации в вашем вопросе - у вас ^~ перед регулярным выражением, где ~ должно быть. У вас должно быть:

location = /admin/secret.php {

location ~ ^/admin/.+\.php$ {