mysql 开源 nginx Firefox 程序员 Ubuntu HTML5 linux wordpress apache java shell php 微软 Android google Python centos Windows linux命令

thinkphp在nginx没有pathinfo的情况出现.php的URL的解决方法

thinkphp在Nginx没有pathinfo的情况出现.PHP的文件,这个让人很是纠结。在服务器是Linux,web服务器是nginx, CGI接口是FASTCGI,就会出现这个问题。

问题原因:ThinkPHP/common/runtime.php中定义IS_CGI常量的定义有问题;错误代码:

thinkphp在nginx没有pathinfo的情况出现.php的URL的解决方法

在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()部分代码:

thinkphp在nginx没有pathinfo的情况出现.php的URL的解决方法

简单来说,当cgi.fix_pathinfo=0时,_PHP_FILE_获取的值是.php,导致U函数生成URL不正确,改为1后,_PHP_FILE_获取的值是index.php。

但是cgi.fix_pathinfo=1时会有安全隐患,目前暂时先把代码改成如下了:

if (IS_CGI) {
//CGI/FASTCGI模式下
            //$_temp  = explode('.php',$_SERVER['PHP_SELF']);
            //define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'],'',
            //$_temp[0].'.php'),'/'));
            define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'], '/'));
        } else {
            define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'], '/'));
        }

延伸阅读

评论

5条评论

写评论
  • 111111 回复

    这个办法最好,,但是你这个什么版本的tp

    ThinkPHP/common/runtime.php
    有这个文件吗?我怎么没有这个文件?

  • Vagh 回复

    楼主 我也遇到了同样的问题 请问除了这样没有什么更好的方法吗?

  • 汶萱。 回复

    为啥我的TP里没找到这个runtime.php

  • 小白 回复

    非常感谢,解决了问题

  • 尹伟 回复

    说的很对,我也是遇到同样提问,代码跟踪到这来、里