thinkphp 二级域名绑定模块,导致设置的路由被多域名共用的问题解决方案

问题背景:

在router.php路由配置文件设置了二级域名和路由设置

use think\Route;
Route::domain(‘www‘,‘index‘);
Route::domain(‘admin‘,‘admin‘);
Route::domain(‘m‘,‘m‘);

Route::rule(‘show/:id‘,‘index/Article/item‘);
Route::rule(‘about_us‘,‘index/index/about_us‘);

遇到的问题:

访问 www.t.com/about_us 会访问  index/index/about_us 即index模块index控制器的about_us方法;

但是 访问 admin.t.com/about_us 也会访问  index/index/about_us ;这显然是我们不想看到的

解决思路:

能不能在Route的rule()中做一个判断?如果当前域名是绑定了admin模块的,但是设置的路由地址(即:index/index/about_us) 的模块不是admin模块,那么就忽略该路由设置

修改源码:

    /**
     * 注册路由规则
     * @access public
     * @param string|array $rule    路由规则
     * @param string       $route   路由地址
     * @param string       $type    请求类型
     * @param array        $option  路由参数
     * @param array        $pattern 变量规则
     * @return void
     */
    public static function rule($rule, $route = ‘‘, $type = ‘*‘, $option = [], $pattern = [])
    {
        $r_data = explode(‘/‘,$route);
        $host_data = explode(‘.‘,$_SERVER [‘HTTP_HOST‘]);
        if(count($r_data) == 3 && count($host_data) == 3){
            $erji_host = $host_data[0];
            if(isset(self::$rules[‘domain‘][$erji_host])){
                if(self::$rules[‘domain‘][$erji_host][‘[bind]‘][0] != $r_data[0]){
                    return false;
                }
            }
        }
        $group = self::getGroup(‘name‘);

        if (!is_null($group)) {
            // 路由分组
            $option  = array_merge(self::getGroup(‘option‘), $option);
            $pattern = array_merge(self::getGroup(‘pattern‘), $pattern);
        }

        $type = strtolower($type);

        if (strpos($type, ‘|‘)) {
            $option[‘method‘] = $type;
            $type             = ‘*‘;
        }
        if (is_array($rule) && empty($route)) {
            foreach ($rule as $key => $val) {
                if (is_numeric($key)) {
                    $key = array_shift($val);
                }
                if (is_array($val)) {
                    $route    = $val[0];
                    $option1  = array_merge($option, $val[1]);
                    $pattern1 = array_merge($pattern, isset($val[2]) ? $val[2] : []);
                } else {
                    $option1  = null;
                    $pattern1 = null;
                    $route    = $val;
                }
                self::setRule($key, $route, $type, !is_null($option1) ? $option1 : $option, !is_null($pattern1) ? $pattern1 : $pattern, $group);
            }
        } else {
            self::setRule($rule, $route, $type, $option, $pattern, $group);
        }

    }

原文地址:https://www.cnblogs.com/cl94/p/11745817.html

时间: 2024-10-10 21:11:38

thinkphp 二级域名绑定模块,导致设置的路由被多域名共用的问题解决方案的相关文章

apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定

摘要:apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定,根据本人实际经验,叫你如何让apache支持中文域名绑定,绝对管用的让apache支持中文域名绑定的方法.在百度搜索:中文域名在线转码然后在线转中文域名为punyco 我从事php开发网站已经有5年之久以前遇到一个同事问我怎么样才能将apache绑定中文域名,支付中文域名访问而我以在实际项目获得并总结的经验告诉他,以下是方法: 根据本人实际经验,叫你如何让apache支持中文域名绑定,绝对管

《快速创建网站》 2.2 负载均衡简介和域名绑定操作

本文是<快速创建网站>系列的第3篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 1. 网站管理平台WordPress和云计算平台Azure简介 (6分钟 本文) 2.1 在Azure上创建网站及网站运行机制 (13分钟) 2.2 域名绑定操作和Azure负载均衡机制 (12分钟) 2.3 WordPress 初始化和网站管理功能 (11分钟) 3.1 WordPress 数据导入 (12分钟) 3.2 WordPress 多站点支持和Azure在线代码编辑

linux下关于Apache设置二级域名绑定二级目录的方法

背景:对于一些论坛网站,某些目录需要制定二级域名去访问,这时候就要在apache中用二级域名绑定二级目录. 方法: 1.首先你要找到apache安装路径,在apahce安装路径下的conf文件夹中找到apache配置文件httpd.conf,打开配置文件,首先确定DocumentRoot路径注释掉(如果这个路径没有注释掉,那么不管用vhost还是用URL重写,都无法正常找到二级域名所绑定的二级目录) 2.开启mod_Rewrite这个模块,在httpd.conf配置文件中找到“#LoadModu

ThinkPHP仿58同城一站多城市路由配置技巧及二级域名部署技巧

ThinkPHP在PATHINFO的URL模式下,URL的格式类似于http://www.domain.com/appName/module/action 即:http://www.domain.com/分组名/模块名/方法名 或者:http://www.domain.com/模块名/方法名 然而在有些类似于58同城这样的应用中,需要分城市展示不同的页面内容,我们希望在网站域名后面紧跟一个城市目录,也即这种格式: http://www.domain.com/城市名/模块名/方法名,根据不同的城市

Linux虚拟主机通过程序实现二级域名绑定到子目录

虚拟主机中CP控制台不支持将二级域名绑定到子目录的功能,用户可以通过程序实现将二级域名绑定到子目录. 有两种方法将二级域名绑定到子目录: 1. 配置.htaccess, 通过伪静态代码实现.具体实现方法参考:http://help.aliyun.com/knowledge_detail/6554929.html?spm=5176.7114037.1996646101.1.SkYPg8&pos=1 虚拟主机和轻云主机通过伪静态实现子目录绑定功能 万网虚拟主机.轻云主机均不支持通过控制台cp.hic

hosts文件该怎么设置?将IP地址与域名绑定的教程

如何绑定hosts文件?怎么将IP地址与域名绑定?作为小编肯定需要hosts来绑定公司ip地址,但是很多人不知道怎么修改设置hosts呢?下面分享将IP地址与域名绑定的教程,需要的朋友可以参考下 什么是Hosts文件? Hosts是一个没有扩展名的系统文件,主要作用是定义IP地址和主机名的映射关系,就是将一些常用的域名网址与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,如果找到,系统会立即打开对应网

禁止IP访问和别人域名绑定或访问自己网站设置

下面的设置仅允许*.ms026.com和www.ms026.com绑定并访问主机NameVirtualHost *<VirtualHost *>ServerName default:80<Location />Order Allow,DenyDeny from all</Location></VirtualHost><VirtualHost *>DocumentRoot ../htdocs/gbServerName www.ms026.comSe

.Net Core 二级域名绑定到指定的控制器

在说二级域名绑定之前,先说一下.net core中的区域,关于区域这一块儿在很久之前的博客中,已经提过,详见<03-dotnet core创建区域[Areas]及后台搭建>,在这篇博客中,创建区域的时候,都是手动创建的,手动创建区域Areas文件夹,手动添加M-V-C等文件目录,由于在最早的VS2017版本中,直接右键添加区域的选项居然没了,然而在后来的VS版本更新中,这一功能又恢复了,也不知微软是出于什么考虑.区域的功能,就不用多说了,至于如何创建如何使用,也不多说,这些都是在MVC4的功能

tomcat域名绑定设置

域名绑定分为单域名绑定.多域名绑定,配置主要涉及到tomcat目录下conf/server.xml文件 一.单域名绑定 1.修改server.xml 大约105行的内容(不是必须修改,如果只是绑定一个域名不修改也没有什么影响,如果绑定多个域名的话,当访问ip时,会直接访问defaultHost中配置的域名) 将原来的<Engine name="Catalina" defaultHost="localhost">修改为: <Engine name=&