【问题标题】:Single Codeigniter Code Base for Multiple Domains多个域的单个 Codeigniter 代码库
【发布时间】:2014-05-10 06:39:11
【问题描述】:

我正在寻找有关如何将 CodeIgniter 用于多个域的清晰说明。我想要一组模型和配置文件,能够根据请求来自的域调用不同的控制器。在做了一些研究之后,我相当确定我目前的设置方式并不理想,我想在我构建得太远之前修复它。这是当前的设置:

我正在管理三个域:

domainA.com
domainB.com
domainC.com

每个域都指向我服务器上的不同文件夹:

/domains
    /global
        /models
            /model1.php
            /model2.php
    /domainA.com   <--- domainA.com points here
            /application
                /controllers
                    /domainAController1.php
                    /domainAController2.php
            /assets
            /system
            /index.php
    /domainB.com    <--- domainB.com points here
            /application
                /controllers
                    /domainBController1.php
                    /domainBController2.php
            /assets
            /system
            /index.php
    /domainC.com    <--- domainC.com points here
            /application
                /controllers
                    /domainCController1.php
                    /domainCController2.php
            /assets
            /system
            /index.php

然后,在每个控制器中,我在构造函数中添加一个包路径,以便控制器可以访问我的全局模型:

$this->load->add_package_path(APPPATH.'../../global/');

这允许我像往常一样从控制器加载模型,例如:

$this->load->model('model1');

我在上面显示的文件夹层次结构不完整。在每个域文件夹中,都有一个完整的 CI 安装。因此,如果我想为整个“应用程序”定义常量或配置参数,我基本上必须做 3 次。此外,我开发的越多,我就越需要更高级的功能,如基本模型和控制器,我觉得我现在使用的这种“包路径”解决方案行不通。

这显然不是正确的方法,我希望有人可以为我提供更好的方法来实现它。

我正在运行 CodeIgniter 版本 2.1.4。

***************************更新**************** ***********

这就是我最终为使其正常工作所做的工作。我希望有人能就这是一个好主意还是坏主意提出建议,也就是说,您是否预见到使用这种方法会出现任何明显的问题?

我使用路由和控制器子文件夹来完成我需要的工作。我现在有一个 CI 安装,在我的控制器文件夹中,我有 domainA.com、domainB.com 和 domainC.com 的子文件夹。

然后,在我的 routes.php 文件中,我在保留的路由之后添加了这个:

switch($_SERVER['SERVER_NAME']){
        case 'domainA.com':
                $controllerSubDirectory = 'domainA.com';
                break;
        case 'domainB.com':
                $controllerSubDirectory = 'domainB.com';
                break;
        case 'domainC.com':
                $controllerSubDirectory = 'domainC.com';
                break;
        default:
                $controllerSubDirectory = '';
                break;
}

    route['(.*)'] = "{$controllerSubDirectory}/$1";

换句话说,我只是接收传入的请求并将其路由,就好像它实际上是通过适当的子文件夹传入的一样,因为它是第一个 URI 段。

这有什么我没有想到的问题吗?也许是某种安全风险?

【问题讨论】:

    标签: php codeigniter codeigniter-2


    【解决方案1】:

    简短回答:利用 CodeIgniter 的“第三方Packages”功能。

    您的目录结构组织得不是很好。没有必要存储 CodeIgniter 系统文件的多个副本,当然假设所有应用程序都使用相同的系统(版本和对核心文件没有/相同的修改)。

    查看CodeIgniter Docs了解更多详情。

    如上所述,您可以利用 CI 的包将您的公共代码打包作为第 3 方包。然后你可以像往常一样加载模型和其他资源,CI 会知道如何自己找到它们。

    【讨论】:

    • 谢谢佩塔。这将如何导致 CI​​ 根据请求的域知道要使用哪些控制器?此外,如果我将我的模型设置为第三方包,我仍然需要在我想在控制器中使用模型的任何时候添加包路径,这与我现在所做的相同。我已经阅读了您链接到的关于运行多个应用程序的文档页面,但这似乎意味着每个“应用程序”在其文件夹中仍然需要模型、控制器等的子目录。还是我误解了?你能告诉我你会使用的目录结构吗?
    • @flyingL123 - 您是正确的,因为每个应用程序都需要有文件的副本(应用程序/第 3 方),但如果您将其组织为第 3 方包,您可以维护 一个包,然后复制/粘贴每个应用程序所需的任何版本。附带说明一下,您能否使用 .htaccess 路由来自不同域的请求?老实说,我不确定,但它可能还需要更改您的 config.php 文件(设置动态主机名)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多