Nginx 位置块不适用于其中的 .php 文件吗?

Nginx 位置块不适用于其中的 .php 文件吗?

因此,为了防止对我的 phpmyadmin 安装进行暴力攻击,我将 nginx 配置为需要 HTTP Basic Auth(额外的用户名和密码),然后请求需要来自白名单 IP 地址。但是,如果我运行https://example.com/phpmyadmin/但是,如果不添加额外的 .php 块,我可以加载https://example.com/phpmyadmin/index.php无需将我的 IP 列入白名单。此问题不会影响 HTTP Basic Auth。发生这种情况有什么原因吗?有没有办法避免添加额外的 .php 块?phpmyadmin 配置区域的副本如下。

# Setup and secure phpMyAdmin
location /phpmyadmin/ {
  allow 1.2.3.4;
  deny all;
  auth_basic "phpMyAdmin - HTTP Basic Login";
      auth_basic_user_file /etc/nginx/pma_pass;
    location ~ \.php$ {
    include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    allow 1.2.3.4;
    deny all;
    }
}

答案1

在大多数 PHP 配置中,有一个location ~ \.php$块会处理以 结尾的任何 URI .php,因此对其他块添加限制location只会影响所涉及的静态文件。请参阅这个文件了解更多信息。

最干净的解决方案是使用带有^~修饰符的前缀位置,这可确保所有以 开头的 URI/phpmyadmin/都由该块处理,并且locations顶级的其他 URI 不会绕过您的安全性。请参阅这个文件了解更多信息。

正如您所发现的,您需要location在该块内添加嵌套来处理 PHP,但身份验证语句都应该被继承,并且不需要在内部块中重复。

例如:

location ^~ /phpmyadmin/ {
    allow 1.2.3.4;
    deny all;
    auth_basic "phpMyAdmin - HTTP Basic Login";
    auth_basic_user_file /etc/nginx/pma_pass;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
}

相关内容