Ваш опыт может варьироваться в зависимости от этого (возможно, потребуется доработать его, чтобы он соответствовал вашему серверу и условиям), но, проведя некоторое тестирование на моем Mac, вот что у меня было умеренным успехом:
Структура каталогов
public_html/
ci/
application/
system/
.htaccess
index.php
Я предполагаю, что у вас в корневом public_html
каталоге есть другие вещи. Поэтому я позволяю .htaccess сосредоточиться на материалах, связанных с CodeIgniter, оставив его в ci
директории.
.htaccess
DirectoryIndex index.php
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.ciwildsub\.dev [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/city/%1/$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Это довольно понятно, но первый блок - это проверка вашего поддомена. Я не стал исключать www
, но вы можете захотеть (как я уже сказал, ваш пробег может отличаться). Второй блок - это стандартное удаление CodeIgniter index.php
.
Эти правила будут применяться только к sub.example.com
или example.com/ci/
URL-адресам, поскольку, как я уже сказал, я предполагаю, что в вашем корне есть вещи, которые не должны нарушаться при перезаписи.
Конфигурация CodeIgniter
$config['uri_protocol'] = 'PATH_INFO';
Из-за того, как Apache обрабатывает URL-адрес типа example.com/index.php/controller/method
, он обходит index.php
и обрабатывает его, как любой другой сегмент каталога. Кроме того, mod_rewrite не обязательно останавливать на теге [L]
- он останавливает обработку .htaccess в этой точке, проходит через RewriteRule, а затем пропускает этот URL через .htaccess. Установка PATH_INFO
помогает убедиться, что CodeIgniter правильно извлекает текущий URI, и наш .htaccess не застревает в цикле проверки.
Однако я отмечу, что я не совсем доволен тем, что вижу в моем выводе RewriteLog - там должен быть способ дальнейшей оптимизации, я просто еще не уверен в этом (На сегодня я закончил с этим возиться!). Извините, если какое-либо объяснение здесь немного не в порядке - я не администратор сервера или эксперт по mod_rewrite, мне просто было весело возиться с этим. Если мне удастся найти лучшее решение, я обязательно обновлю это.
Похоже, END
flag идеально подходит для таких ситуаций ( для предотвращения [L]
циклов), но это доступно только в Apache 2.3.9+. Поиск продолжается.
person
Aken Roberts
schedule
12.04.2013