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

4 nginx whitelist http-basic-authentication phpmyadmin

因此,为了帮助防止对我的 phpmyadmin 安装的暴力攻击,我将 nginx 配置为需要 HTTP 基本身份验证(额外的用户名和密码),然后请求需要来自列入白名单的 IP 地址。但是,如果我运行https://example.com/phpmyadmin/,IP地址白名单工作正常,但是如果不添加额外的 .php 块,我可以加载https://example.com/phpmyadmin/index.php而不将我的 IP 列入白名单。此问题不会影响 HTTP 基本身份验证。发生这种情况有原因吗?无论如何要避免添加额外的 .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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*ith 5

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

最简洁的解决方案是使用前缀的位置与^~修改,这确保了开头的所有的URI/phpmyadmin/由该块被处理,以及其他locations在顶层不要绕过您的安全。有关更多信息,请参阅此文档

正如您所发现的,您将需要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;
    }
}
Run Code Online (Sandbox Code Playgroud)