Subdominio comodín .htaccess y Codeigniter

Estoy tratando de crear el .htaccess adecuado que me permita mapear como tal:

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/

Aquí, alguien escribiría las URL anteriores, sin embargo, internamente, se redireccionaría como si fuera la URL de la derecha.

Además, el subdominio sería dinámico (es decir, http://user.domain.com no es un subdominio real, pero sería una reescritura de .htaccess)

Además, / home es mi controlador predeterminado, por lo que ningún subdominio lo forzaría internamente a / home controller y cualquier ruta que lo siga (como se muestra en el ejemplo n. ° 2 anterior) sería la función (catch-all) dentro de ese controlador.

Del mismo modo, si se pasa un subdominio, se pasará como un controlador (catch-all) junto con cualquier función (catch-all) para él (como se muestra en el ejemplo # 4 anterior)

Con suerte, no estoy pidiendo mucho aquí, pero parece que no puedo averiguar el .htaccess adecuado o las reglas de enrutamiento (en Codeigniter) para esto.

httpd.conf y los hosts están bien configurados.

EDITAR #1

Aquí está mi .htaccess que se está acercando pero se está estropeando en algún momento:

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]

Con lo anterior, cuando visito: http://test.domain/abc/123 esto es lo que noto en $ _SERVER var (he eliminado algunos de los campos):

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
)

Puede ver que PATH_TRANSLATED no se está formando correctamente y creo que eso puede estar arruinando las cosas.

preguntado el 08 de enero de 11 a las 19:01

2 Respuestas

Ok, creo que lo he resuelto. Esto es lo que tengo hasta ahora.

Primero el .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]

Y finalmente route.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";
?>

Como puede ver desde arriba, todo funciona. Lo único que no puedo entender es por qué se repiten los últimos argumentos cuando uso un subdominio.

Si lo hago: http://domain/foo/bar/123

Entonces mi PATH_INFO se muestra como / foo / bar / 123 / que es perfecto

Pero si lo hago: http://me.domain/foo/bar/123

Entonces mi PATH_INFO se muestra como /user/me/index.php/foo/bar/123/bar/123/ Lo que en su mayor parte está bien, pero ¿por qué se repiten los parámetros al final?

Así que sí, en general, creo que está funcionando. Lo único que tendré que hacer es tener varias rutas para cualquier controlador que agregue a mi \ controllers. ¿A menos que haya una forma de evitarlo?

Respondido el 09 de enero de 11 a las 06:01

Esto debería funcionar. Pruébelo y avíseme si funciona:

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

Respondido el 08 de enero de 11 a las 23:01

Gracias takinbo, lamentablemente eso no funcionó. Resultó en un servidor 500 (la solicitud superó el límite de 10 redireccionamientos internos debido a un probable error de configuración) - Gautam

Haré una prueba sobre esto y descubriré la combinación correcta. - takinbo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.