24

这似乎是一个常见的要求,但我无法找到有关执行此类操作的明确说明。

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

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

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

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

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

student.mysite.com/help/contact :将打开mysite.com/students/help/contact控制器students ()方法help()参数“contact”

student.mysite.com/help/contact/email :将打开mysite.com/students/help/contact控制器students ()方法help()参数“contact”,“email”

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

第 1 步将允许anything.mysite.com返回根目录(mysite.com/index.php)

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

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

我想我真的被第 1 步难住了。我在一个共享主机帐户上,这是我可以通过CPanel做的吗?我尝试为*.mysite.com添加一个子域,但没有任何运气(除非我只需要等待更长时间才能进行传播,但我觉得我弄错的可能性更高)。

回到我家的 WAMP 安装,我会更改 httpd.conf,对吗?我可以在不修改该文件的情况下实现此效果吗(因为我可能不能,因为我是使用 webhostinghub.com 共享的)

唷,谢谢你的时间!- 基思

4

4 回答 4

36

当您想使用特定域来引导您的控制器时,我想出的是使用该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)

于 2014-02-26T19:14:27.977 回答
4

第 1 步:在 CPanel 中,在域中,在子域中,添加*.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 进行了重写。

于 2014-02-24T07:34:20.783 回答
4

在 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']];
}
于 2015-07-11T12:47:29.967 回答
3

!!!
除了 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;
}

导航到“teachers.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;
}

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

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

于 2017-11-18T17:25:37.673 回答