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 

如果没有findascript.php ,FastCGI将开始检查path以查看某个部分是否实际上匹配一个文件。 这样,假定:

 /uploads/myavatar.gif 

存在是因为某人上传了该文件,该文件将被处理,并在PATH_INFO中包含$ uri的剩余部分。 所以,'/script.php'将是PATH_INFO中的一个'gif文件'的值,或者也许是另一个扩展名的PHP文件。

所以build议的解决scheme不要落在这样的警告之上是使用:

 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将被testing为一个给定的根的存在。
  • 如果它不是文件或目录,则使用404失败。
  • 如果没有失败,则将相同的path传递给fastcgi。

我的问题是

  • 在评估每个文件选项时,try_files是如何工作的,还有一个proxy_pass或者fast_cgi的通行证? 看来我对它的工作原理有错误的印象。
  • 谁有一个root指令和fastcgi_pass指令,关于文件检查优先? (也我感兴趣的可能性有proxy_pass为基于python的项目,它装载本地服务器像gunicorn )。

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

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

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

所以, try_files的行为与是否存在fastcgi_passproxy_pass无关。

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

然后,通过.gif文件解决可能的漏洞的原始问题的解决scheme是将此指令包含在PHP位置块中:

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

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

这样PHP就获得了正确的PHP文件名作为脚本来执行。