web-dev-qa-db-ja.com

Codeigniterコントローラーにつながるサブドメイン?

これはよくあるリクエストのようですが、このようなことを行うための明確な指示を見つけることができませんでした。

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/helpcontrollerstudents()methodhelp()

students.mysite.com/help/contact:開きますmysite.com/students/help/contactcontrollerstudents()methodhelp()argument"contact"

students.mysite.com/help/contact/email:開きますmysite.com/students/help/contactcontrollerstudents()methodhelp()arguments"contact"、 "email"

something.mysite.com現在エラーが返されていることに気付きました。だから私は理解します:

ステップ1anything.mysite.comがルートを返すことを許可します(mysite.com/index.php)

ステップ2サブドメインを読み取り、そのコントローラーを呼び出す

ステップは、最初の「/」の後の最初の引数を読み取り、コントローラーのそのメソッドを呼び出し、残りのURL部分を引数として渡します。

私は本当に困惑していると思いますステップ1。私は共有ホスティングアカウントを使用していますが、これはCPanelを介して実行できることですか? *。mysite.comのサブドメインを追加しようとしましたが、運が悪かったのです(ただし、伝播を待つ必要があった場合を除きますが、間違った可能性が高いと感じています)。

自宅のWAMPインストールに戻って、httpd.confを変更しますよね?そのファイルを変更せずにこの効果を達成できますか(webhostinghub.comを使用して共有されているため、おそらくできないため)

ふぅ、お時間をいただきありがとうございます! -キース

24
Keith

特定のドメインを使用してコントローラーに接続したいので、私が思いついたのは、それを実現するために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がそれを完全に行う方法を説明しています)、すべてが機能するようになります。共有ホスティングは問題があり、サーバーを構成する必要はありません。

32
Chococroc

ステップ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から書き直しただけです。

4
Dwayne Towell

Application/config/routers.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'に移動すると、予期された 'teachers'コントローラーではなく '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'に移動すると、 'teachers'コントローラーが読み込まれ、そのコントローラー内で 'login'関数が実行されます。

各ドメインのサブフォルダーなど、強制できるものは他にもあります。

1
Josh