导致Codeigniter控制器的子域


Subdomains leading to Codeigniter Controllers?

这似乎是一个常见的请求,但我还没有找到关于做这样的事情的明确说明。

我想要一个子域来触发我的CI安装上的某个控制器。例如:

students.mysite.com:将打开mysite.com/students(技术上:mysite.com/index.php/students控制器:students(

teachers.mysite.com:将打开mysite.com/teachers

当遍历更深时保留子域。例如:

students.com/help:将打开mysite.com/students/help(控制器students((方法帮助(((

students.mysite.com/help/contact:将打开mysite.com/students/help/contact

students.mysite.com/help/contact/email:将打开mysite.com/students/help/contact

我意识到something.mysite.com现在返回一个错误。所以我想:

步骤1将允许anything.mysite.com返回根(mysite.com/index.php(

步骤2将读取子域并调用该控制器

步骤3将读取第一个"/"之后的第一个参数,并调用控制器的该方法,并将剩余的url部分作为参数传递

我想我真的被步骤1难住了。我在一个共享托管帐户上,这是我可以通过CPanel完成的吗?我尝试为*.mysite.com添加子域,但没有任何运气(除非我只需要等待更长的时间来进行传播,但我觉得出错的几率更高(。

回到我的家庭WAMP安装,我会更改httpd.conf,对吧?我可以在不修改该文件的情况下获得这种效果吗(因为我可能做不到,因为我是使用webhostinghub.com共享的(

哇,谢谢你抽出时间!-Keith

p>当你想使用特定的域来连接你的控制器时,我想到的是使用application/config/routes.php文件来实现它。这个想法是根据你使用的子域加载不同的控制器,所以,你不需要为你的域写路由列表,而是根据你访问的域写一个路由列表:
switch ( $_SERVER['HTTP_HOST'] ) {
    case 'students.mysite.com':
        $route['default_controller'] = "students";
    break;
    case 'teachers.mysite.com':
        $route['default_controller'] = "teachers";
    default:
        // The list of your $routes lines at is was...
    break;
}

要做到这一点,你只需要将子域指向你的CI项目(另一个答案的步骤1中的Dwayne Towell解释了如何完美地完成它(,你就可以让一切正常工作,你的共享托管不会成为问题,你也不必配置服务器。

更新

阅读此答案后,请查看@Josh的答案(https://stackoverflow.com/a/47368922/1168804)因为它提供了一种很好的方式来组织路由代码,以避免控制器出现意外的路由行为。值得一读(并向上投票,;D(

步骤1:在CPanel中的Domains和子域中,添加*.mysite.com(您只输入*部分(以重定向到/public_html/(您不输入任何内容和/或删除通配符((或将其设置为www.mysite.com当前的默认值。

步骤2&3:使用mod_rewrite捕获子域并将其移动到URL的"目录"部分。我怀疑它会是这样的:(但我还没有尝试过,RewriteLogLevel 9是你的朋友(

RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^'.]+)'.mysite'.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/index.php/%1/$1 [L]

我也不知道你是否可以使用.htaccess来完成上述操作。我只从httpd.conf.

在application/config/routes.php文件中,您需要编写

$subDomains = array();
$subDomains['students.mysite.com'] = "student";
$subDomains['teachers.mysite.com'] = "teachers";
if(array_key_exists($_SERVER['HTTP_HOST'], $subDomains)) {
  $route['default_controller'] = $subDomains[$_SERVER['HTTP_HOST']];
}


除了Chococroc的伟大例子之外,你不想忘记的一个非常重要的步骤是将任何分段路由回子域控制器,否则你最终会路由到一个可能不存在的控制器。使用Chococroc现有代码的示例

switch ( $_SERVER['HTTP_HOST'] ) {
    case 'students.mysite.com':
        $route['default_controller'] = "students";
    break;
    case 'teachers.mysite.com':
        $route['default_controller'] = "teachers";
    default:
        // The list of your $routes lines at is was...
    break;
}

导航到"教师.mysite.com/login"将加载"登录"控制器,而不是预期的"教师"控制器。

如果您不希望出现这种意外行为,则需要将任何分段路由回子域控制器。它们现在将成为该控制器的一个功能。

switch ( $_SERVER['HTTP_HOST'] ) {
    case 'students.mysite.com':
        $route['default_controller'] = "students";
        $route['(:any)'] = "students/$1";
    break;
    case 'teachers.mysite.com':
        $route['default_controller'] = "teachers";
        $route['(:any)'] = "teachers/$1";
    default:
        // The list of your $routes lines at is was...
    break;
}

导航到"教师.mysite.com/login"将加载"教师"控制器,并在该控制器中运行"登录"功能。

您还可以强制执行其他内容,例如每个域的子文件夹等。