Подстановочный поддомен .htaccess и Codeigniter - PullRequest
2 голосов
/ 08 января 2011

Я пытаюсь создать правильный .htaccess, который позволил бы мне отображать так:

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/

Здесь кто-то может ввести вышеуказанные URL, однако внутри, он будет перенаправлен так, как если бы онесли бы URL был справа.

Также поддомен будет динамическим (то есть http://user.domain.com не является действительным поддоменом, но будет перезаписан .htaccess)

Также/ home - мой контроллер по умолчанию, поэтому ни один поддомен не будет внутренне принудительно устанавливать его для / home controller, и любые пути, следующие за ним (как показано в примере №2 выше), будут (catch-all) функцией внутри этого контроллера.

Точно так же, если будет передан поддомен, он будет передан как (catch-all) контроллер вместе с любыми (catch-all) функциями для него (как показано в # 4 примере выше)

Надеюсь, я нездесь я спрашиваю много, но я не могу понять, какие правильные .htaccess или правила маршрутизации (в Codeigniter) для этого.

httpd.conf и хосты настроены просто отлично.

РЕДАКТИРОВАТЬ # 1

ЗдесьЭто мой .htaccess, который приближается, но в какой-то момент все портится:

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]

С вышеизложенным, когда я посещаю: http://test.domain/abc/123 это то, что я замечаю в $ _SERVER var (Я удалил некоторые поля):

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
)

Вы видите, что PATH_TRANSLATED не формируется должным образом, и я думаю, что это может испортить ситуацию?

Ответы [ 2 ]

0 голосов
/ 09 января 2011

Хорошо, я думаю, что решил это. Вот что у меня есть.

Первый .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]

И, наконец, rout.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";
?>

Как видите, все работает. Единственное, что я не могу понять, это почему последние аргументы повторяются, когда я использую поддомен?

Если я это сделаю: http://domain/foo/bar/123

Тогда мой PATH_INFO отображается как / foo / bar / 123 / , что идеально

Но если я это сделаю: http://me.domain/foo/bar/123

Тогда мой PATH_INFO отображается как / user / me / index.php / foo / bar / 123 / bar / 123 / Что по большей части нормально, но почему параметры повторяются в конце?

Так что да, в целом, я думаю, что это работает. Единственное, что мне нужно сделать - это иметь несколько маршрутов для любых контроллеров, которые я добавляю в свои \ контроллеры. Разве есть способ обойти это?

0 голосов
/ 08 января 2011

Это должно работать. Пожалуйста, проверьте и дайте мне знать, если это работает:

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