2011-01-08 15 views
2

Ich versuche, die richtige .htaccess zu schaffen, die ich als solche Karte erlauben würde:Wildcard Subdomain .htaccess und Codeigniter

http://domain.com/    --> http://domain.com/home 
http://domain.com/whatever  --> http://domain.com/home/whatever 
http://user.domain.com/   --> http://domain.com/user 
http://user.domain.com/whatever --> http://domain.com/user/whatever/ 

hier jemand in den obigen URLs eingeben würde jedoch intern, wäre es Umleiten, als wäre es die URL rechts.

Auch die Sub-Domain dynamisch sein würde (das heißt, http://user.domain.com ist nicht eine tatsächliche Sub-Domain, sondern wäre eine .htaccess Rewrite sein)

Auch/home ist mein Standard-Controller so würde keine Sub-Domain zwingen sie intern/home Controller und alle darauf folgenden Pfade (wie in Beispiel 2 oben gezeigt) wären die (catch-all) Funktion innerhalb dieses Controllers.

Wie weise, wenn eine Sub-Domain übergeben wird, es wäre für sie zusammen mit allen (catch-all) als ein (catch-all) Controller erhalten geben (wie in # 4 Beispiel oben)

Hoffentlich ich Ich frage nicht viel hier, aber ich kann nicht scheinen, die richtigen. Htaccess oder Routing-Regeln (in Codeigniter) dafür herauszufinden.

httpd.conf und Hosts sind gut eingerichtet.

EDIT # 1

Hier ist meine .htaccess, die nahe kommt, aber an einem gewissen Punkt ist vermasselt:

RewriteEngine On 

RewriteBase/
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 

RewriteCond %{HTTP_HOST} ^([a-z0-9-]+).domain [NC] 
RewriteRule (.*) index.php/%1/$1 [QSA] 

RewriteCond $1 !^(index\.php|images|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L,QSA] 

Mit der oben, wenn ich unter: http://test.domain/abc/123 das ist, was ich bemerke in $ _SERVER var (ich habe einige der Felder entfernt):

Array 
(
    [REDIRECT_STATUS] => 200 
    [SERVER_NAME] => test.domain 
    [REDIRECT_URL] => /abc/123 
    [QUERY_STRING] => 
    [REQUEST_URI] => /abc/123 
    [SCRIPT_NAME] => /index.php 
    [PATH_INFO] => /test/abc/123 
    [PATH_TRANSLATED] => redirect:\index.php\test\test\abc\123\abc\123 
    [PHP_SELF] => /index.php/test/abc/123 
) 

Sie die PATH_TRANSLATED ist nicht richtig für zu sehen sein med und ich denke, das könnte Dinge vermasseln?

Antwort

-1

Dies sollte funktionieren. Bitte testen Sie und lassen Sie mich wissen, wenn es funktioniert:

RewriteEngine On 
RewriteCond %{HTTP_HOST}    ^[^.]+\.domain\.com$ 
RewriteRule ^(.+)      %{HTTP_HOST}$1  [C] 
RewriteRule ^([^.]+)\.domain\.com(.*) /$1$2     [L] 
RewriteRule ^(.*)      /home$1    [L] 
+1

Danke Takinbo, leider hat das nicht funktioniert. Es resultierte in einem Server 500 (Anforderung überschritten das Limit von 10 internen Weiterleitungen aufgrund eines möglichen Konfigurationsfehlers) – Gautam

+0

Ich werde einen Test ausführen und die richtige Kombination herausfinden. – takinbo

0

Ok, ich glaube, ich habe es gelöst. Hier ist, was ich bisher habe.

Zuerst wird die .htaccess

RewriteEngine On 

RewriteBase/

# if REQUEST_URI contains the word "user" and the 
# SERVER_NAME doesn't contain a "." re-direct to the root 
# The reason this is done is because of how the last two rules 
# below are triggered 
RewriteCond %{REQUEST_URI} (user) [NC] 
RewriteCond %{SERVER_NAME} !\. 
RewriteRule (.*)/[L,R=301] 

# Allow files and directories to pass 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 

# Codeigniter rule for stripping index.php 
RewriteCond $1 !^(index\.php|images|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [C] 

# Force wild-card subdomains to redirect. 
# E.g. http://me.domain/foo/bar/123 as http://domain/user/me/index.php/foo/bar/123/bar/123/ 
RewriteCond %{HTTP_HOST} ^([a-z0-9-]+).domain [NC] 
RewriteRule (.*) /index.php/user/%1/$1/ [L] 

Und schließlich routes.php

<?php 
// Force routing to userhome controller if URL contains the word "user" 
// otherwise force everything else to home controller 
$route['user/:any'] = "userhome"; 
$route[':any'] = "home"; 
?> 

Wie Sie sehen können, über alles funktioniert. Das einzige, was ich nicht herausfinden kann ist, warum die letzten Argumente wiederholt werden, wenn ich eine Subdomain verwende?

Wenn ich tun: http://domain/foo/bar/123

Dann ist mein PATH_INFO gezeigt als /foo/bar/123/ die

perfekt

Aber wenn ich tun: http://me.domain/foo/bar/123

Dann ist mein PATH_INFO gezeigt wie /user/me/index.php/foo/bar/123/bar/123/ Was zum größten Teil ist OK, aber warum wiederholt sich die Parameter am Ende?

Also yea insgesamt Ich denke, es funktioniert. Ich brauche nur mehrere Routen für alle Controller, die ich meinen \ controllern hinzufüge. Es sei denn, es gibt einen Weg dahin?