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

本文解决ThinkPHP框架在Nginx环境下没有pathinfo配置时出现的问题,涉及PHP_SAPI、IS_CGI常量及_URL_常量定义等关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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'], '/'));
        }
针对ThinkPHP项目在Nginx服务器上的配置,尤其是隐藏入口文件和启用PathInfo功能,是一项重要的优化措施。要实现这一点,需要对Nginx的配置文件进行一系列设置。 参考资源链接:[Nginx部署ThinkPHP:配置路径重写与隐藏index.php](https://wenku.csdn.net/doc/6453403fea0840391e778ede) 首先,确保你的Nginx版本和ThinkPHP项目兼容,以及PHP-FPM已经正确安装和配置。在Nginx的配置文件中,需要设置server块,具体包括监听端口、服务器名称、根目录、索引文件、位置块等。 下面是一个配置示例,假设你的ThinkPHP项目存放在/opt/thinkphp/目录下,你需要将server_name设置为你的域名: ``` server { listen 80; server_***; root /opt/thinkphp/public/; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~* ^/(app|extend|public|thinkphp|usr)/ { deny all; } } ``` 在上述配置中,我们使用了`try_files`指令来尝试提供静态文件,如果不存在,则将请求重定向到index.php,并通过`$query_string`参数传递原始请求。对于PHP文件的请求,通过`fastcgi_pass`指令将请求转发到PHP-FPM进程。 关于隐藏入口文件,通常是通过在location块中设置重写规则来实现。在上述配置中,我们将所有非PHP的请求尝试提供文件,如果找不到文件,则默认解析到index.php,这样就隐藏了入口文件。 此外,确保你的ThinkPHP项目配置文件(通常是application/config.php)中的`url_route_on`和`url_html_suffix`选项设置正确,以便正确解析请求的URL。 在进行配置更改后,记得重新加载Nginx配置(使用`nginx -s reload`命令),并且在部署前彻底测试你的应用,确保一切运行正常。 为了更深入地理解ThinkPHPNginx的集成,以及如何处理常见的配置问题,推荐阅读《Nginx部署ThinkPHP:配置路径重写与隐藏index.php》。这份资料详细讲解了ThinkPHPNginx下的部署要点,包括配置文件的编写和调试技巧,对于想要深入学习和优化ThinkPHP项目部署的开发者来说,是一份宝贵的资源。 参考资源链接:[Nginx部署ThinkPHP:配置路径重写与隐藏index.php](https://wenku.csdn.net/doc/6453403fea0840391e778ede)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值