Codeigniter 一项具有多个访问点、子域、htaccess 的服务

Posted

技术标签:

【中文标题】Codeigniter 一项具有多个访问点、子域、htaccess 的服务【英文标题】:Codeigniter one service with multiple access points, subdomains, htaccess 【发布时间】:2013-02-24 19:05:50 【问题描述】:

我不完全确定如何正确措辞,所以我提前道歉。我有一个稍微独特的设置,但同时不是那么独特。我想拥有

api.domain.com
m.domain.com
domain.com

所有人都使用相同的代码库,但提供不同的视图,并使用不同的控制器集。但是,我不想通过在特定于子域​​本身的各种目录中制作它的镜像副本来复制我的代码库。对我来说,这是多余的,与高效相反,因为我必须管理 3 组以上的模型、库,在某些情况下还需要管理控制器。维护不同版本服务的功能。

现在,我的设置和工作是通过不断增长的路由。php 是一种说明在通过普通域时使用什么控制器的方法。

domain.com
domain.com/m/
domains.com/api/

目前哪种方法有效,但我正在尝试考虑哪种方法最有利于服务的组织和未来发展。

所以我的所有问题是,我如何设置 codeigniter 以支持使用子域的这种逻辑,同时将所有内容保存在一个主代码库中。这合理吗?如果可以,如何实现?

【问题讨论】:

可能重复:***.com/questions/7085670/… 不完全是我正在寻找的解决方案,但请引导我跳出框框思考,尽可能想出我自己的变体。 【参考方案1】:

好的,所以在对我的原始帖子发表评论后,将我指向堆栈上的另一个帖子,我想出了一个处理我的问题的好方法。它不完全是在链接中找到的答案,而不仅仅是基于逻辑的衍生品。由于我有多个子域,我想推出每个具有自己的一组功能和需求,以及只应从这些子域调用的特定于其原因的控制器。

这就是说我的解决方案,对于那些可能偶然发现的人来说,在routes.php 中,我最终制作了一个小函数来获取HTTP_HOST 基于. 将其拆分并从那里使用它到我的需要。我的例子如下。

请注意,我还替换了 routes.php 中的所有内容,因此它不仅仅是 $route['this/that'] = 'dir/controller'; 的直线

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| URI ROUTING
| -------------------------------------------------------------------------
| This file lets you re-map URI requests to specific controller functions.
|
| Typically there is a one-to-one relationship between a URL string
| and its corresponding controller class/method. The segments in a
| URL normally follow this pattern:
|
|   example.com/class/method/id/
|
| In some instances, however, you may want to remap this relationship
| so that a different class/function is called than the one
| corresponding to the URL.
|
| Please see the user guide for complete details:
|
|   http://codeigniter.com/user_guide/general/routing.html
|
| -------------------------------------------------------------------------
| RESERVED ROUTES
| -------------------------------------------------------------------------
|
| There area two reserved routes:
|
|   $route['default_controller'] = 'welcome';
|
| This route indicates which controller class should be loaded if the
| URI contains no data. In the above example, the "welcome" class
| would be loaded.
|
|   $route['404_override'] = 'errors/page_missing';
|
| This route will tell the Router what URI segments to use if those provided
| in the URL cannot be matched to a valid route.
|
*/
function whichSubRoute()

    $subs = array(
                "api"=>"api/",
                "m"=>"m/"
                );

    $curr = $_SERVER['HTTP_HOST'];
    $curr = explode('.', $curr);
    if(array_key_exists($curr[0], $subs))
    
        return array($curr[0], $subs[$curr[0]]);
    
    return false;


//due to the the way this setup works, some controller references
//can be found multiple times (and in no particular order).
//also note due to this setup, each method has its own default and 404
$choiceRoute = whichSubRoute();
if($choiceRoute !== false)

    if($choiceRoute[0]=="api")
    
        $route['default_controller'] = "welcome";
        $route['404_override'] = '';
        //start version 1 (mvp API)
        $route['1.0/user/(:any)'] = $choiceRoute[1].'v1_userinfo/index/$1';
        //controllers outside of "/api"
    
    if($choiceRoute[0]=="m")
    
        $route['default_controller'] = "welcome";
        $route['404_override'] = '';
        //start version 1 (mobile)
        $route['welcome']                   = $choiceRoute[1].'m_welcome';
        $route['dashboard']                 = $choiceRoute[1].'m_dashboard';
        $route['user/(:any)']               = $choiceRoute[1].'m_userinfo/index/$1';
        $route['reg']                       = 
        //controllers outside of "/m"
        $route['login/auth']                = 'login/auth';
        $route['logout/mobile']             = 'logout/mobile';
        //end version 1 (mobile)
    

else

    $route['default_controller'] = "welcome";
    $route['404_override'] = '';

/* End of file routes.php */
/* Location: ./application/config/routes.php */

另外请记住,我确实需要每个子域的默认控制器和 404 控制器

【讨论】:

【参考方案2】:

我想你可以根据 ENVIRONMENT 常量加载不同的配置。

http://ellislab.com/codeigniter/user-guide/libraries/config.html

您可能会根据当前加载不同的配置文件 环境。 ENVIRONMENT 常量在 index.php 中定义,并且是 处理环境部分中有详细描述。

要创建特定于环境的配置文件,请创建或复制一个 application/config/ENVIRONMENT/FILENAME.php 中的配置文件

例如,要创建仅用于生产的 config.php,您可以:

创建目录 application/config/production/ 复制你现有的 config.php 进入上述目录编辑 application/config/production/config.php 所以它包含你的 生产设置

【讨论】:

以上是关于Codeigniter 一项具有多个访问点、子域、htaccess 的服务的主要内容,如果未能解决你的问题,请参考以下文章

在地图上绘制路线,具有多个标记,CodeIgniter

.htaccess 问题、虚拟子域和 Codeigniter

Codeigniter 子域路由

如何使用 .htaccess 在 codeigniter 中实现动态子域?

将 Codeigniter 项目从主域复制到子域

想要在 codeigniter 中创建动态子域?