2015-01-25 11 views
6

Ich versuche, eine oder eine Reihe von Subdomains auf einen Ordner innerhalb "Controller" Ordner einer CI-Installation umleiten. Ich habe eine Menge Sachen ausprobiert, die hier auf SO gefunden wurden, aber keine funktionieren für mein Projekt oder haben die gleichen Spezifikationen, die ich brauche. Da ich ein bisschen wie ein Anfänger bin, wenn es um .htaccess geht, habe ich mir gedacht, dass ich nur jemanden fragen könnte, der hier besser qualifiziert ist. Hier sind die Angaben:CodeIgniter - Umleitung Subdomains auf Ordner in "Controller"

  • mit this awesome .htaccess file als Basis
  • müssen mindestens diese drei Sub-Domains umleiten (www | admin | api) zu/application/controllers/(www | admin | api) äquivalente Ordner
  • ohne die REQUEST_URI zu verlieren (nur sagen)
  • und ohne tatsächlich

Beispiel die URL in der Adressleiste zu ändern: http: // api .domain.com/einige/uri/Segmente intern CI_installation_folder/application/controllers/api/some/uri/Segmente so etwas wie dieses

Ich habe versucht (und Variationen) umleiten sollte:

RewriteCond %{HTTP_HOST} ^(www|admin|api) [NC] 
RewriteRule ^(.*)$ /%1/$1 [L,R=301] 

oder ersetzt die RewriteRule mit 2 anderen Linien wie so:

RewriteCond %{ENV:REDIRECTED} !true 
RewriteRule ^(.*)$ [L,R=301,E=REDIRECTED:true] 

die Schleife zu verhindern, aber alles, was ich bekommen kann, ist entweder ein Looping Redirect (1. Fall) oder ev en ein 500-Server-Fehler auf einigen Variationen :(

diesen

RewriteCond %{REQUEST_URI} !^/(www|admin|api) [NC] 

Hinzufügen wird auch, da ich die URL in der Adressleiste zu ändern bin nicht nicht funktionieren. Mit der [P] Flagge habe ich auch keinen Erfolg.

Kann jemand helfen? Vielen Dank!

Antwort

4

Haben Sie versucht, die Routenkonfiguration von Codeigniter zu verwenden?

Sie müssen htaccess nicht umschreiben - obwohl es ein gültiger Ansatz ist, können Sie einfach für die Subdomain in der config/route.php Datei suchen und das Routing für Ihre Subdomains festlegen.

switch ($_SERVER['HTTP_HOST']) { 
    case 'admin.domain.com': 

     $route['(:any)'] = "admin/$1"; // this will set any uri and add the controler fodler to it 

     $route['default_controller'] = "admin/home"; // set the default controller for this subdomain 

     break; 

    case 'api.domain.com': 

     $route['(:any)'] = "api/$1"; // this will set any uri and add the controler fodler to it 

     $route['default_controller'] = "api/home"; // set the default controller for this subdomain 

     break; 
} 

Wenn Sie möchten, dass eine allgemeinere/dynamisches Routing sein, können Sie es wie diese haben (in der gleichen config/route.php-Datei):

$controllerFolderName = array_shift((explode(".",$_SERVER['HTTP_HOST']))); 

$route['(:any)'] = $controllerFolderName."/$1"; 
$route['default_controller'] = $controllerFolderName."/home"; 

dieses Routing für alle Sub-Domains funktionieren und legt das Standard-Routing auf einen Ordner im Controller-Ordner mit dem gleichen Namen wie die Subdomain fest, sodass Sie für eine Domain wie api.domain.com die Route auf api usw. eingestellt haben.

Es ist wichtig, dass Sie für alle Ordnernamen die gleiche Logik beibehalten, dass sie immer zu Ihrer Subdomain passen. Außerdem würde ich vorschlagen, ein Fehlerbehandlungssystem für Besucher ohne Subdomain (http://domain.com) hinzuzufügen Subdomain, aber ein Ordner mit diesem Namen existiert nicht (Sie können das mit file_exits tun)

+0

Vielen Dank für die schnelle Antwort, aber meine Idee war es auf dem niedrigsten möglichen Niveau zu tun. Und wenn Sie auch in Betracht ziehen, dass ich nicht Ihr durchschnittlicher "nur mach es Arbeit" Typ bin, werden Sie feststellen, dass dies keine gültige Lösung für mich ist: |. Ich möchte etwas, das dynamisch und einfach zu warten ist, ohne Regeln, Routen und andere Dinge duplizieren zu müssen. –

+1

Also, du willst das Leben einfach sein ... das ist ein sehr guter Ansatz ... lass mich meine Antwort aktualisieren – Lupin

+0

Dieser Ansatz ist ein bisschen sauberer :) Und ich könnte nur ein bisschen zu wählerisch sein, aber wenn ich sagte Ich wollte dies auf dem niedrigsten Level tun, das möglich war. Ich drückte meinen Wunsch aus, dass dieses Problem mit einem ** .htaccess Redirect ** gelöst werden kann, weil Leistung in meinem Fall von Bedeutung ist :) –

1

Nach ein paar weiteren Stunden des Grabens denke ich, dass ich das Problem gelöst habe. Hier ist, wie (für diejenigen, die Pflege):

# Subdomains to Folders + Enforce www RewriteCond %{HTTP_HOST} ^(www|admin|api) [NC] RewriteRule ^(.*)$ http://www.localhost/%1/$1 [L,P,S=1] RewriteRule ^(.*)$ http://www.localhost/$1 [L,R=301]

ich die interne Weiterleitung mit der www-Enforcer Regel kombiniert. Alles, was danach zu tun ist, ist die Konfiguration des Apache Servers, um die PROXY-Anfrage zu akzeptieren und richtig umzuleiten :)

Haben phun!

Verwandte Themen