2015-01-25 3 views
6

Я пытаюсь перенаправить любой или набор поддоменов в папку внутри папки «контроллеры» установки CI. Я пробовал кучу вещей, найденных здесь на SO, но никто не работает для моего проекта или не имеет тех же спецификаций, в которых я нуждаюсь. Поскольку я немного нуб, когда дело доходит до .htaccess, поэтому я решил, что могу просто попросить кого-нибудь более квалифицированного здесь. Вот спецификации:CodeIgniter - перенаправлять поддомены, установленные в папку в «контроллерах»

  • с использованием this awesome .htaccess file в качестве основы
  • нужно перенаправить по крайней мере, эти три подобласти (WWW | администратор | API) в/приложение/контроллеры/(WWW | администратор | API) эквивалентные папки
  • без потери REQUEST_URI (просто говоря)
  • и без фактического изменения URL в адресной строке

Пример: HTTP: // апи .domain.com/некоторые/URI/сегменты должны внутренне перенаправлять CI_installation_folder/приложение/контроллеры/API/некоторые// URI сегменты

Я пытался что-то вроде этого (и вариации):

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

или заменить RewriteRule с 2-мя другими линиями, как так:

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

, чтобы предотвратить цикл, но все, что я могу получить это либо перекручивание редирект (первый случай) или эв ан ошибке 500 сервера на некоторых вариациях :(

Добавление этого

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

также не будет работать, так как я не меняя URL в адресной строке. Я также не добился успеха с флагом [P].

Может ли кто-нибудь помочь? Благодаря!

ответ

4

Вы пытались использовать конфигурацию маршрута Codeigniter?

Вы не должны использовать htaccess rewrite - хотя его действительный подход, вы можете просто проверить субдомен в файле config/route.php и установить маршрутизацию для ваших поддоменов.

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

Если вы хотите, чтобы это было более общий/динамической маршрутизации, вы можете иметь его, как это (в том же config/route.php файле):

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

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

эта маршрутизация будет работать для всех поддоменов и установит маршрутизацию по умолчанию в папку внутри папки контроллера с тем же именем, что и поддомен, поэтому для домена, такого как api.domain.com, у вас будет маршрут, установленный на api и т. д.

Важно, чтобы вы сохраняли ту же логику для всех имен папок, что они всегда будут соответствовать вашему поддомену, и я также предлагаю добавить систему обработки ошибок для посетителей без субдомена (http://domain.com) и для случаев, когда у вас есть субдомен, но папка с этим именем не существует (вы можете сделать это с помощью file_exits)

+0

Благодарим за быстрый ответ, но моя идея состояла в том, чтобы сделать это на самом низком возможном уровне. И если вы также учтете, что я не ваш средний «просто сделай это», парень, вы поймете, что это недействительное решение для меня: |. Я хочу что-то динамичное и удобное в обслуживании без необходимости повторять правила и маршруты и прочее. –

+1

Итак, вы хотите, чтобы жизнь была легкой .... это очень хороший подход ... позвольте мне обновить свой ответ – Lupin

+0

Этот подход немного чист :) И я мог бы быть немного слишком придирчивым, но когда я сказал Я хотел сделать это на самом низком уровне, возможно, я действительно выразил свое желание решить эту проблему, используя **. Htaccess redirect **, потому что производительность имеет значение в моем случае :) –

1

После нескольких часов рытья я думаю, что я решил проблему. Вот как (за исключением тех, которые заботятся):

# 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]

Я объединил внутренний редирект с правилом WWW Инфорсер. Все, что нужно сделать после этого, - это настроить сервер Apache для принятия и правильной перенаправления запроса PROXY :)

Имейте phun!

Смежные вопросы