关闭

ThinkPhp子域名绑定控制器中方法

标签: thinkphp
1821人阅读 评论(0) 收藏 举报
分类:

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');
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:33119次
    • 积分:544
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:0篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论