Sous-domaines menant aux contrôleurs Codeigniter?

Cela semble être une demande commune, mais je n'ai pas été en mesure de trouver des instructions définitives pour faire quelque chose comme ça.

Je voudrais qu'un sous-domaine déclenche un certain contrôleur sur mon installation CI. Par exemple:

Students.mysite.com : ouvrirait mysite.com/students (techniquement: mysite.com/index.php/students. contrôleur: les élèves)

Teachers.mysite.com : ouvrirait mysite.com/teachers

Tout en préservant le sous-domaine lors de la traversée plus profonde. Par exemple:

Students.mysite.com/help : ouvrirait mysite.com/students/help (contrôleur: les étudiants(), méthode: aider())

Students.mysite.com/help/contact : ouvrirait mysite.com/students/help/contact (contrôleur: les étudiants(), méthode: aider(), argument: "contact")

Students.mysite.com/help/contact/email : ouvrirait mysite.com/students/help/contact (contrôleur: les étudiants(), méthode: aider(), arguments: "contactez", "e-mail")

Je me rends compte que something.mysite.com maintenant retourne une erreur. Donc je me dis:

Étape 1 serait en permettant anything.mysite.com pour retourner la racine (mysite.com/index.php)

L'Étape 2 serait de lire le sous-domaine et d'appeler ce contrôleur

L'Étape 3 {[7] } serait de lire le premier argument après le premier " / " et d'appeler cette méthode du contrôleur, et de passer les parties d'url restantes en tant qu'arguments

Je suppose vraiment que je suis perplexe à Étape 1 . Je suis sur un compte d'hébergement partagé, est-ce quelque chose que je peux faire via CPanel ? J'ai essayé d'ajouter un sous-domaine pour *. mysite.com sans aucune chance (sauf si j'avais juste besoin d'attendre plus longtemps pour la propogation, mais je pense que les chances sont plus élevées que je me suis trompé).

De retour sur mon installation WAMP maison, je changerais httpd.conf, droit? Puis-je réaliser cet effet sans modifier ce fichier (puisque je ne peux probablement pas, puisque je suis partagé en utilisant webhostinghub.com)

Ouf, merci pour votre temps! - Keith

22
demandé sur Prodikl 2013-10-22 12:51:04

4 réponses

Comme vous voulez utiliser un domaine particulier pour conduire à vos contrôleurs, ce que j'ai trouvé était d'utiliser le fichier application/config/routes.php pour y parvenir. L'idée est de charger différents contrôleurs en fonction du sous-domaine que vous utilisez, donc, au lieu d'écrire une liste de routes pour votre domaine, vous écrivez une liste de routes en fonction du domaine auquel vous accédez:

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

Pour que cela fonctionne, il vous suffit de pointer le sous-domaine vers votre projet CI (Dwayne Towell à L'étape 1 de l'autre réponse explique comment faire parfaitement) et vous aurez tout ce travail, votre hébergement mutualisé ne sera pas un problème et vous n'aurez pas à configurer le serveur.

30
répondu Chococroc 2014-02-26 19:14:27

Étape 1: dans CPanel, dans les domaines, dans les sous-domaines, ajoutez *.mysite.com (vous n'entrez que la partie *) pour rediriger vers /public_html/ (vous n'entrez rien et / ou supprimez le caractère générique) (ou définissez-le sur quelle que soit la valeur par défaut actuelle pour www.mysite.com est actuellement.

Etapes 2 et 3: Utilisez mod_rewrite pour capturer le sous-domaine et le déplacer vers la partie "répertoire" de L'URL. Je soupçonne que ce sera quelque chose comme: (mais je ne l'ai pas encore essayé, RewriteLogLevel 9 est votre ami)

RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^\.]+)\.mysite\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/index.php/%1/$1 [L]

Je ne sais pas non plus si vous pouvez faire ce qui précède en utilisant .htaccess. Je n'ai fait que réécrire à partir de httpd.conf.

4
répondu Dwayne Towell 2014-02-24 07:34:20

Dans application / config / routes.fichier php, vous devez écrire

$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
répondu AkshayBandivadekar 2015-07-11 12:47:29

!!!
Une étape très importante que vous ne voulez pas oublier en plus du bon exemple de Chococroc est de router tous les segments vers le contrôleur de sous-domaine sinon vous finirez par router vers un contrôleur qui n'existe probablement pas. Exemple utilisant le code existant de 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;
}

Navigation vers 'teachers.mysite.com/login' chargera le contrôleur 'login' et non le contrôleur 'teachers' attendu.

Si vous ne voulez pas ce comportement inattendu, vous devez Router tous les segments de retour au contrôleur de sous-domaine. Ils seront maintenant une fonction de ce contrôleur.

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

Navigation vers 'teachers.mysite.com/login' va maintenant charger le contrôleur 'teachers' et exécuter la fonction' login ' dans ce contrôleur.

Il y a d'autres choses que vous pouvez appliquer comme un sous-dossier pour chaque domaine, etc.

0
répondu Josh 2017-11-18 17:25:37