try_files 如何与 fast_cgi 协同工作?

try_files 如何与 fast_cgi 协同工作?

我是 Nginx 的新手,看到指南告诉我如果我这样做:

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
}

(简化示例来自https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/)。

那么我的理解是,如果客户要求:

/uploads/myavatar.gif/ascript.php

并且ascript.php未找到,FastCGI 将开始检查路径中是否有某个部分真正与文件匹配。这样,假设:

/uploads/myavatar.gif

因为有人上传了该文件而存在,该文件将被视为具有 PATH_INFO 中 $uri 的剩余部分。因此,“/script.php”将是 PATH_INFO 中“gif 文件”或 ab 的值y PHP 文件是否有其他扩展名?

因此,为了避免出现此类警告,建议使用以下解决方案:

location ~ \.php$ {
    try_files $uri $uri/ =404;
    fastcgi_pass 127.0.0.1:9000;
}

我的理解try_files将检查每个替代文件规范并且:

  • 最后一个规范必须存在,否则将抛出 500。
  • 最后的规范必须是带有等号的错误代码。
  • 最后的规范必须是另一个声明的@location(例如,可以是“_pass”。

我以为我理解了但似乎我理解的不正确是:根据指令检查文件root(即 try_files 通过检查最近的root目录并附加每个文件规范来工作)。所以,我的想法是这样的:

root /var/nginx/www;
#assume this directory exists
location ~ \.php$ {
    try_files $uri $uri/ =404;
    fastcgi_pass 127.0.0.1:9000;
}

#each uri would be tested like root$uri, root$uri/, or fail with =404

但如果这是逻辑的话,在新的观点下我不认为这是正确的,那么:

  • 将测试 .php 是否存在于给定的根目录中。
  • 如果它不是文件也不是目录,则会失败并出现 404。
  • 如果没有失败,则将相同的路径传递给 fastcgi。

我的问题是

  • 当评估每个文件替代方案并且有 proxy_pass 或 fast_cgi 传递时,try_files 如何工作?我似乎对它的工作原理有错误的印象。
  • root关于文件检查,在有指令和有指令之间谁优先?(此外,我对基于 python 的项目安装 - 每个 - 本地服务器的fastcgi_pass可能性很感兴趣)。proxy_passgunicorn

答案1

try_files是一个简单的文件存在性检查器。它只是检查文件 ( $uri) 或目录 ( $uri/) 是否存在。

如果两者都不存在,则返回 404 错误。

如果文件存在,则继续执行下一行,即fastcgi_passproxy_pass或已配置的任何其他内容。

因此,的行为与或try_files是否存在无关。fastcgi_passproxy_pass

try_files总是使用root指令来检查文件的存在。

然后,解决通过 .gif 文件可能利用的原始问题的方法是在 PHP 位置块中包含此指令:

fastcgi_split_path_info ^(.+\.php)(/.+)$;

您还需要cgi.fix_pathinfo在 php.ini 中将其设置为 false。

这样,PHP 就会获取正确的 PHP 文件名作为要执行的脚本。

相关内容