【问题标题】:Subdomains leading to Codeigniter Controllers?导致 Codeigniter 控制器的子域?
【发布时间】:2013-10-31 01:10:40
【问题描述】:

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

我想要一个子域来触发我的 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控制器students() 方法help())

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

students.mysite.com/help/contact/email: 将打开 mysite.com/students/help/contact控制器students()方法help()参数“联系人”,“电子邮件”

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

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

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

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

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

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

唷,感谢您的宝贵时间! - 基思

【问题讨论】:

  • 您是否为您的域设置了通配符 dns? Apache 配置是它的另一半。您需要将所有 *.domain.com 指向您的网站的 CNAME 或 A 记录。 Google 会在这方面为您提供帮助。
  • 感谢您的提示。我刚刚设置了一个值为 mysite.com 的 *.mysite.com CNAME 记录。那会照顾第1步吗?它似乎还没有工作,所以我要让它传播,然后再试一次
  • 我无法为您提供代码,但我认为您的 .htaccess 应该能够以您喜欢的方式重写子域
  • 你解决了吗?您的问题现在是该特定主题在 Google 中的最高搜索结果。
  • 这个视频是为了类似的事情youtu.be/518eRiSOTlY

标签: php apache .htaccess codeigniter cpanel


【解决方案1】:

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

【讨论】:

  • 该死的,非常聪明的解决方案。非常感谢!
  • 不触碰 .htaccess 文件,以及子域的控制器排他性,很好的答案。
  • 这节省了我很多时间 :) 非常感谢。
  • 但是你会在不同的ENVIRONMENTs 之间遇到问题......我正在研究一个完美的解决方案,因为这不能解决我的问题。
  • @Ema4rl,最后这是关于路由的。如果您有多个环境,唯一可能发生的情况是您需要与开关不同的东西(可能是in_array('dev.student.site.com', 'student.site.com') or even two switch`,并根据环境选择要使用的环境。或者更好的是,创建一个传递域和环境的路由器类,它会自动返回控制器。
【解决方案2】:

第 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 重写。

【讨论】:

  • 非常感谢这篇文章。我尝试了一些非常相似的方法,但上次没有用。我会尝试按照您的方式编写它并返回结果!
  • 如何修改这个 .htaccess sn-p 以允许 www。前缀?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 非常好的补充!我在我的答案中添加了一个更新,以帮助人们找到你的答案,它提供了非常好的建议,:D
    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 2011-10-28
    • 2013-12-24
    • 2020-03-09
    • 2023-03-04
    • 2016-03-30
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多