ThinkPhp3.2版本中可以将子域名和模块、控制器绑定,但不可以和控制器中方法绑定,现在我有个需求要求子域名直接和控制器中方法绑定,比如访问www.csdn.net直接访问Home模块/Main控制器/main方法,而访问blog.csdn.net直接访问Home模块/Main控制器/user方法,就像csdn个人主页地址blog.csdn.net/joyfixing,后面的joyfixing是user方法的传参。
首先来实现访问www.csdn.net直接访问Home模块/Main控制器/main方法,这个很简单,在配置文件中为模块/控制器/方法设置默认值即可。
'DEFAULT_MODULE' => 'Home', // 默认模块
'DEFAULT_CONTROLLER' => 'Main', // 默认控制器名称
'DEFAULT_ACTION' => 'main', // 默认操作名称
如果想在访问Home模块/Main控制中其它方法时隐藏Home模块/Main控制器,首先隐藏Home模块。
'MODULE_ALLOW_LIST' => array('Home','Admin'),
'DEFAULT_MODULE' => 'Home', // 默认模块
接着要绑定Main控制器,在入口文件中绑定。
// 绑定访问Mian控制器,默认控制器为Main,实现了控制器Main的隐藏
define('BIND_CONTROLLER','Main');
后续访问Home模块/Main控制器中的方法只要在www.csdn.net后面加方法就可以访问了。
接下来要实现的是本文重点,ThinkPhp子域名绑定控制器中方法,既然ThinkPhp没有提供该方法,我们可以在index.php入口文件中根据域名绑定不同的控制器和方法来实现。
if($_SERVER['HTTP_HOST'] == "blog.csdn.net"){
// 根据需求可绑定控制器,
// define('BIND_CONTROLLER','Blog');
// 域名blog.huxinyi.cn默认访问方法user
define('BIND_ACTION','user');
}else{
// 默认控制器为Main,实现了控制器Main的隐藏
define('BIND_CONTROLLER','Main');
}
此时访问blog.csdn.net就访问Home模块/Main控制器/user方法了。假设user方法有个参数username,根据不同的username显示不同用户的主页。如果username为joyfixing此时URL地址应该为blog.csdn.net/username/joyfixing,这多难看啊,要想办法把username给隐藏掉,URL地址应该为blog.csdn.net/joyfixing,此时需要用到Action参数绑定按变量顺序绑定,设置URL_PARAMS_BIND_TYPE
为1,然后访问blog.csdn.net/joyfixing就相当于访问blog.csdn.net/username/joyfixing了。
温馨提示:
这里'DEFAULT_ACTION'=>'user',
和define('BIND_ACTION','user');
都可以实现隐藏user方法,不同点为define('BIND_ACTION','user');
为永久隐藏方法user,此时想访问其它方法都不可以了,所以要慎重使用define('BIND_ACTION','user');
开启子域名虽然可以简化URL地址,但同时也带来了一些不便,开启子域名后blog.csdn.net和www.csdn.net之间session和cookie就不能共享了,可以设置cookie的domain为csdn.net实现共享,session则需要设置两套。
在blog.csdn.net/joyfixing中提交评论需要用到ajax post到Home模块/Main控制器/addComment方法,在js中post url不能直接写‘/addComment’,这样url就是blog.csdn.net/addComment,此时addComment就是user方法的username传参了(使用define('BIND_ACTION','user');
的后果),url应该写成http://www.csdn.net/addComment
,此时又引入了一个新的问题,ajax 跨越,浏览器的同源策略限制了ajax从域blog.csdn.net提交到www.csdn.net,此时需要使用jsonp来解决。如果不想用jsonp解决跨域的问题,那应该避免跨域的存在,把addComment方法和user方法放到同一个控制器中,且不能用define('BIND_ACTION','user');
绑定方法使其它方法无法调用,我的建议是www.csdn.net对应模块Home,blog.csdn.net对应模块Blog,在Blog模块的配置文件中设置默认控制器和方法
'DEFAULT_CONTROLLER' => 'Blog', // 默认控制器名称
'DEFAULT_ACTION' => 'user', // 默认操作名称
这样当访问blog.csdn.net时默认访问Blog模块/Blog控制器/user方法了,也可以访问Blog控制器中其它方法了。此外还需要在入口文件index.php中根据域名绑定模块
if($_SERVER['HTTP_HOST'] == "blog.csdn.net"){
// 绑定模块Blog
define('BIND_MODULE','Blog');
}else{
// 绑定模块Main
define('BIND_MODULE','Main');
}