[ThinkPHP 3.1.3] __PUBLIC__解析的问题 在二级目录下开发基于ThinkPHP项目,有时会发现__PUBLIC__不太一样。 例如说 在开发个论坛,项目在 localhost/bbs/ 下,在模版中使用__PUBLIC__时,会得到/bbs/Public 另外又在开发个BoKe时,项目在 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',// 站点公共目录 再往上找,在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,然后再取成/或\(看系统),最后再判断后定义 结论 所以大家如果在二级目录部署基于thinkphp项目时,要保证APP_NAME或二级目录名是不一样的!不然__PUBLIC__会让你疼一会。 |