nginx 位置和优先级(忽略 *.php 的拒绝)

nginx 位置和优先级(忽略 *.php 的拒绝)

我以前是一位经验丰富的 Apache 管理员,但我决定大胆尝试学习 nginx。到目前为止,一切似乎都相当直观,但很明显我还没有完全掌握 nginx 的做事方式,所以我相当肯定这是一个很容易解决的问题,但我似乎找不到一个明显的答案。

我有一台使用 php-fpm 服务器的 PHP 服务器,我希望通过源 IP 限制对我的文档根目录中某些子目录的访问(例如:phpmyadmin、我编写的一些测试脚本等)。无论出于什么原因,我设置的限制似乎对目录和文件都运行良好,但 FastCGI 服务器提供的 PHP 文件显然绕过了此访问限制。我已通过在受限目录中创建不同类型的测试文件来验证情况确实如此。文本和 HTML 文件确实被拒绝并返回 403,但 PHP 文件无论其内容如何似乎都已被解析并返回给客户端。

以下是我认为的与我的网站配置相关的部分:

# pass all PHP scripts to FastCGI server socket
location ~ \.php$ {
  # Filter out arbitrary code execution
  location ~ \..*/.*\.php$ {return 404;}
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
  fastcgi_pass unix:/var/run/php5-fpm.sock;
}

# allow access to tools pages as necessary
location ~ /tools/ {
  allow 10.11.12.13/32;
  allow 10.11.12.14/32;
  deny all;
}

配置中还有更多内容,但据我所知,没有影响 PHP 文件或 /tools/ 位置的指令。我正在寻找的行为是限制 /tools/ 下的所有文件,无论文件类型如何,除非存在针对相关 IP 范围的明确允许规则。

如果您能对此提供任何帮助,为我指明正确的方向,我将不胜感激!

答案1

这是因为 nginx 会从一个匹配的位置块(而不是多个)处理请求。此外,nginx 有一个特定的流程来选择它,请参阅我的答案类似问题或阅读官方文档了解详情。

我猜您还在某处使用指令来告诉 nginx在进入目录或子目录时index提供文件,并且该指令触发内部重定向到不受访问限制的 php 位置块。index.phptools

您将需要使用嵌套位置块或使用更具体的正则表达式。

相关内容