我们在搭建部分thinkphp框架的网站的时候,要求绑定的网站的目录是/public/目录,而不是根目录。
如果是宝塔服务器里面还好,可以直接设置网站运行目录,或者把域名绑定到二级目录里面。
但是虚拟主机,只能绑定根目录是web目录,没有选择,这时候,我们就用到使用.htaccess来绑定/public/了。
方法:在根目录下面新建.htaccess,把下面的内容,复制进去,即可访问。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ public/$1?Rewrite [L,QSA]
</IfModule>
好了,虚拟主机绑定二级目录的方法就介绍到这里了,本人亲自测试没有问题,如你你也这个需求的话,按照本方法操作即可。
thinkphp伪静态,二级目录伪静态
2020-3-11 10:52 Wednesday
location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; } } #根目录下en目录下面的伪静态规则 location /en/ { if (!-e $request_filename){ rewrite ^/en/(.*)$ /en/index.php?s=$1 last; break; } }
如何把thinkphp安装到二级目录 下面应该试用于thinkphp3
define('THINK_PATH', './test/ThinkPHP/');
define('APP_NAME', 'Admin');
define('APP_PATH', './Admin/');
require_once THINK_PATH.'ThinkPHP.php';
[ThinkPHP 3.1.3]
__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__会让你疼一会。