我是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将检查每个备选文件规范和:
我认为我的理解,但似乎我不明白它正确的是:文件检查对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
但是,如果这是在这种新的光芒下我看不到的逻辑,那么:
我的问题是 :
root指令和fastcgi_pass指令,关于文件检查优先? (也我感兴趣的可能性有proxy_pass为基于python的项目,它装载本地服务器像gunicorn )。 try_files是一个简单的文件存在检查器。 它只是检查,如果文件( $uri )或目录( $uri/ )存在。
如果这两者都不存在,则会返回404错误。
如果文件存在,则继续执行下一行,即fastcgi_pass或proxy_pass或其他任何已configuration的文件。
所以, try_files的行为与是否存在fastcgi_pass或proxy_pass无关。
try_files总是使用root指令来检查文件的存在。
然后,通过.gif文件解决可能的漏洞的原始问题的解决scheme是将此指令包含在PHP位置块中:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
您还需要在php.ini中将cgi.fix_pathinfo设置为false。
这样PHP就获得了正确的PHP文件名作为脚本来执行。