这似乎是一个常见的请求,但我无法找到关于做类似事情的明确指示。
我想在我的CI安装上触发某个控制器的子域。例如:
students.mysite.com :会打开 mysite.com/students (技术上: mysite.com/index.php/students 。 控制器: 学生)
teachers.mysite.com :会打开 mysite.com/teachers
在遍历更深处时保留子域。例如:
students.mysite.com/help :会打开 mysite.com/students/help (控制器:学生() ,方法: help())
students.mysite.com/help/contact : 会打开 mysite.com/students/help/contact (控制器:学生(),方法: help(),参数:“contact”)
students.mysite.com/help/contact/email : 会打开 mysite.com/students/help/contact (控制器:学生(),方法: 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共享)
P,谢谢你的时间! - 基思答案 0 :(得分:32)
由于您希望使用特定域来引导您的控制器,我想到的是使用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项目(Dwayne Towell在另一个答案的第1步中解释了如何完美地完成它)并且您将使一切正常运行,您的共享主机赢了'这是一个问题,您不必配置服务器。
答案 1 :(得分: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重写了。
答案 2 :(得分: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']];
}
答案 3 :(得分:1)
<强> !!! 强>
除了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;
}
导航至&#39; teachers.mysite.com/login'将加载“登录”&#39;控制器不是预期的教师&#39;控制器。
如果您不想要这种意外行为,则需要将任何段路由回子域控制器。它们现在将成为该控制器的一个功能。
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;
}
导航至&#39; teachers.mysite.com/login'现在将加载教师&#39;控制器并运行登录&#39;该控制器内的功能。
您可以执行其他操作,例如每个域的子文件夹等。