如何在 nginx 的子位置中全局使用 FastCGI 和基本身份验证?

6 php nginx

我最近部署了我的第一个 nginx 设置,一切都非常好,除了位置解析让我发疯。我有一个简单的 php fastcgi 设置,如下所示:

location ~ \.php {
    if (!-e $request_filename) {
            return 404;
    }

    include /etc/nginx/fastcgi.conf;
    keepalive_timeout 0;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9000;
}
Run Code Online (Sandbox Code Playgroud)

现在我想用这样的基本身份验证来保护一些位置:

 location /madmin {
         auth_basic "Restricted";
         auth_basic_user_file /var/www/localhost/admincp/.htpasswd;
 }
Run Code Online (Sandbox Code Playgroud)

使用他的设置,nginx 在访问 /madmin 时会要求输入密码,但不会在 /madmin/foo.php 上询问。如果我将身份验证位置更改为“位置 ~ ^/madmin”,那么 nginx 将提供 php 文件以供下载...

是不是可以在 nginx 中配置多个位置?如果没有,这里的解决方法是什么?

谢谢你的帮助。

Mar*_*ald 0

这样做的原因是 nginx 会选择可用的最具体的位置块。正则表达式匹配的位置将胜过纯字符串匹配。

因此,当您请求 /madmin 时,它会与您的身份验证位置匹配,但任何以 .php 结尾的内容都会首先到达该位置。

位置 ~^ /madmin 在不解析的情况下提供 php 代码的原因是因为如果以下正则表达式匹配,则 ~^ 会停止搜索。

您可以在此处查看位置文档:http://wiki.nginx.org/NginxHttpCoreModule#location