使用 Nginx 的多个受保护位置

使用 Nginx 的多个受保护位置

我正在尝试使用 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$ {

相关内容