关于ThinkPHP框架项目在二级目录时,__PUBLIC__路径的问题

本文探讨了ThinkPHP框架在二级目录部署时__PUBLIC__路径解析的问题及解决方法。当APP_NAME与二级目录名相同时,__PUBLIC__路径可能指向错误的位置。文章提供了两种解决方案并建议避免APP_NAME与二级目录名相同。

title: 关于ThinkPHP框架项目在二级目录时,__PUBLIC__路径的问题
tags: ThinkPHP,PUBLIC
grammar_cjkRuby: true
---
**__PUBLIC__解析的问题**
在二级目录下开发基于ThinkPHP项目,有时会发现__PUBLIC__不太一样。

例如说

在开发个论坛,项目在 localhost/bbs/ 下,在模版中使用__PUBLIC__时,会得到/bbs/Public

另外又在开发个博客时,项目在 localhost/blog 下,在模版中使用__PUBLIC__时,却有可能会得到/Public

路径一旦不对那Public下的css,js,img全都挂了。

解决方案一

首先,最简单的就是自己去配置__PUBLIC__的值,在config.php中

'TMPL_PARSE_STRING' => array(  
    '__PUBLIC__' => '/blog/Public',  
);  

但这是个问题啊,不能逃。

解决方案二

于是只好去分析下源码了(谈不上分析,简单得很)

在 ContentReplaceBehavior.class.php 文件中找到__PUBLIC__的定义
line 48:

'__PUBLIC__'    =>  __ROOT__.'/Public',// 站点公共目录  

/Public是没错的,于是问题导向__ROOT__
line 41:

'__ROOT__'      =>  __ROOT__,       // 当前网站地址  

再往上找,在runtime.php文件中找到__ROOT__的源定义

line 49-57

if(!defined('__ROOT__')) {  
    // 网站URL根目录  
    if( strtoupper(APP_NAME) == strtoupper(basename(dirname(_PHP_FILE_))) ) {  
        $_root = dirname(dirname(_PHP_FILE_));  
    }else {  
        $_root = dirname(_PHP_FILE_);  
    }  
    define('__ROOT__',   (($_root=='/' || $_root=='\\')?'':$_root));  
}  

直接看出玄机来了。
如果说 APP_NAME 和 入口文件的路径的名字相同的话 $_root将会两遍 dirname 入口 文件。

也就是说,APP_NAME(入口文件中配置项)如果和二级目录名相同的话,将会直接取到主机名。

如上的blog, $_root会先取 /blog,然后再取成/或(看系统),最后再判断后定义 ($_root=='/' || $_root=='\\')?'':$_root)
结论
所以大家如果在二级目录部署基于thinkphp项目时,要保证APP_NAME或二级目录名是不一样的!不然__PUBLIC__会让你疼一会。

转载于:https://www.cnblogs.com/andyxq/p/7217137.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值