Я пытаюсь защитить пару мест, используя базовую 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$ {