我正在尝试使用 Nginx 自带的基本 HTTP 身份验证来保护几个位置,但由于某种原因,它不起作用。
我有:
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;
}
答案1
Nginx 处理位置的规则如下:它会枚举所有普通位置并找到最精确匹配的位置(Nginx 会对所有普通位置进行排序以优化此步骤)。之后,Nginx 会按照出现的顺序运行所有“正则表达式”位置。如果任何“正则表达式”位置成功,Nginx 将使用第一个匹配。如果没有“正则表达式”位置成功,Nginx 将使用上一步找到的普通位置。
在您的情况下,由于“正则表达式”位置优先于“前缀”位置,这就是为什么/admin/.+\.php$
选择您来处理对 的请求/admin/secret.php
。
可以使用^~
修饰符禁止搜索正则表达式位置或使用修饰符指定精确匹配=
:
location = /admin/secret.php { ...
笔记我刚刚注意到你问题中的配置片段是错误的——你^~
在正则表达式前面加上了,而实际上~
应该加上。你应该加上的是:
location = /admin/secret.php {
location ~ ^/admin/.+\.php$ {