Thinkphp3.2 U方法错误解析index.php为.php的解决方法
匿名 · 更新于 2017/11/20
thinkphp在nginx没有pathinfo的情况出现.php的文件,这个让人很是纠结。
在服务器是linux,web服务器是nginx, CGI接口是FASTCGI,就会出现这个问题
问题原因:ThinkPHP/common/runtime.php中定义IS_CGI常量的定义有问题;
错误代码:
在fpm下,PHP_SAPI的值是fpm-fcgi,所以判断IS_CGI为0。导致在定义_PHP_FILE_常量时错误,进而导致 ThinkPHP/Lib/Core/Dispatcher.class.php中定义__APP__常量值错误。而ThinkPHP/Common /functions.php中U()方法定义用到__APP__,导致U()创建的URL错误;
U()部分代码:
简单来说:
当cgi.fix_pathinfo=0时
_PHP_FILE_获取的值是.php
导致U函数生成URL不正确
改为1后
_PHP_FILE_获取的值是index.php
但是cgi.fix_pathinfo=1时会有安全隐患
目前暂时先把代码改成如下了
修改项目下ThinkPHP/ThinkPHP.php文件大概80行附近
if(IS_CGI) { //CGI/FASTCGI模式下 die($_SERVER['PHP_SELF']); $_temp = explode('.php',$_SERVER['PHP_SELF']); define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'],'',$_temp[0].'.php'),'/')); }else { define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'],'/')); }
修改后代码
if(IS_CGI) { //CGI/FASTCGI模式下 $_temp = explode('.php',$_SERVER['PHP_SELF']); if(empty($_temp[0])){ define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'],'',''),'/')); }else{ define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'],'',$_temp[0].'.php'),'/')); }}else { define('PHP_FILE', rtrim($_SERVER['SCRIPT_NAME'],'/')); }


