子域导致Codeigniter控制器?

这似乎是一个普遍的要求,但是我还没有能够find像这样做的明确指示。

我想要一个子域来触发我的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(controller:studentsmethodhelp()

students.mysite.com/help/contact :将会打开mysite.com/students/help/contact(controller:students(),method:help(),argument:“contact

students.mysite.com/help/contact/email :将会打开mysite.com/students/help/contact(controller:students(),method:help(),arguments:“contact”,“email

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

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

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

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

我想我真的被困在第一步 。 我在一个共享的托pipe帐户,这是我可以通过CPanel做什么? 我尝试着为* .mysite.com添加一个子域名而没有任何运气(除非我只是需要等待更长的时间,但是我觉得错误的可能性更高)。

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

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

正如你想使用一个特定的域导致你的控制器,我想到的是使用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:在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重写。

在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; } 

导航到“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”现在将加载“教师”控制器,并在该控制器中运行“登录”功能。

还有其他的东西可以执行,如每个域的子文件夹等。