如果传递了某个参数,nginx 将使用 auth_basic 关闭某个位置

如果传递了某个参数,nginx 将使用 auth_basic 关闭某个位置

有一个 URL /index.php。如果将参数“foo”设置为“bar”,则应限制对它的访问,即/index.php任何人都可以自由打开,并且/index.php?foo=bar只有在获得基本授权后才能打开。我知道这个if指令,

location = index.php {
    if ($arg_foo ~ bar) {
        auth_basic "";
        auth_basic_user_file myauth;  
    }
    fastcgi_pass unix:/var/run/php-fpm.socket;
}

…但是单独的locationwithif不允许auth_basic放在if子句中。所以我认为应该有某种rewrite到其他位置的方法,可能传递一个包含我们想要到达的原始位置的标头,检查标头,在通过身份验证后,重写到该位置,但这一切看起来太像黑客了,可能可以更轻松地完成,但我不知道怎么做。

答案1

我建议你使用map, 自从auth_basic具有禁用身份验证的特殊off值:

http {
    [...]
    map $arg_foo $auth_realm {
        default off;
        ~bar    "";
    }

    server {
        [...]
        location = /index.php {
            auth_basic $auth_realm;
            auth_basic_user_file myauth;

            fastcgi_pass unix:/var/run/php-fpm.socket;
        }
    }
}

注意:我怀疑您提供的配置片段不起作用,因为该location指令的 URI 前缀不是以强制/字符开头。

相关内容