Nginx位置块不适用于它们内部的.php文件吗?

因此,为了防止对我的phpmyadmin安装的蛮力攻击,我configuration了nginx以要求HTTP基本身份validation(额外的用户名和密码),然后请求需要来自列入白名单的IP地址。 然而,IP地址白名单工作正常,如果我运行https://example.com/phpmyadmin/,但不添加额外的.php块,我可以加载https://example.com/phpmyadmin/index.php没有我的IP列入白名单。 此问题不会影响HTTP基本身份validation。 这有什么原因吗? 无论如何,以避免不得不添加额外的.php块? 下面是phpmyadmin的configuration区域的副本。

# 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; } } 

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

最简洁的解决scheme是使用含有^~修饰符的前缀位置,从而确保以/phpmyadmin/开头的所有URI都由该块处理,并且顶层的其他locations不会绕过您的安全性。 请参阅此文档了解更多

正如你已经发现的,你将需要添加一个嵌套的location来处理该块内的PHP,但是authentication语句应该全部被inheritance,并且不需要在内部块中重复。

例如:

 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; } }