Как установить htaccess при установке CodeIgniter на существующий сайт

Я искал ответ и был удивлен, что не смог найти эту конкретную ситуацию:

У меня есть "прямой" PHP-сайт по адресу http://www.mysites.com/site1/. и хотите со временем перенести его на CodeIgniter. Я знаю, что есть несколько способов сделать это, но я хотел бы оставить существующий сайт в покое и просто поместить папку CodeIgniter (CI) в корневой каталог (site1), а затем перенаправить запросы к нему, если файл или каталог не не существует.

Итак, этот файл .htaccess находится в папке site1:

RewriteEngine on
RewriteBase /site1/CI/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|images|robots\.txt|assets)
RewriteRule ^(.*)$ index.php/$1 [L]

и этот файл .htaccess находится в папке site1/CI (нужен?):

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|images|robots\.txt|assets)
RewriteRule ^(.*)$ index.php/$1 [L]

и файл config.php CodeIgniter содержит:

$config['base_url'] = 'http://www.mysites.com/site1/CI/';

Это прекрасно работает, если я пытаюсь перейти к местоположению на существующем сайте (например, http://www.mysites.com/site1/page.php), но если я попытаюсь перейти на страницу, которая должна быть перенаправлена ​​в CodeIgniter (например, http://www.mysites.com/site1/home), я получаю сообщение об ошибке 404 от CodeIgniter. Похоже, что он ищет метод «дом» в контроллере «сайт1» вместо контроллера «дом».

Затем я попробовал этот файл .htaccess в корневом каталоге, чтобы избавиться от «site1», передаваемого в index.php:

RewriteBase /site1/CI/
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond $1 !^(index\.php|images|robots\.txt|assets)
RewriteRule /site1/(?:(.*)) index.php/$1 [L]

К сожалению, это заставило Apache вернуть ошибку 404.

Любые идеи? Спасибо!


person ScottyB    schedule 18.11.2013    source источник


Ответы (1)


Наконец-то у меня все заработало для размещения приложения CI внутри существующего сайта на один уровень в папке. Вот как я это сделал.

Используемая структура папок:

  • site1
    • page1.php
    • страница2.php
    • и т.д...
    • CI
      • application
      • ресурсы
      • система
  • сайт2
  • сайт3

.htaccess в папке site1:

RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond $1 !^(images|robots\.txt|assets)
RewriteRule ^(.*)$ CI/index.php/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 ^assets
RewriteRule ^(.*)$ CI/$1 [L]

Обратите внимание, что я взял обычный «index.php» из третьего RewriteCond в первом блоке (из-за маршрутизации HybridAuth и CodeIgniter, описанной ниже). Второй блок заключается в перенаправлении ссылок на папку ресурсов страницы CodeIgniter в папку ресурсов внутри папки CI. (В противном случае мне пришлось бы переместить папку с ресурсами в папку site1.)

Это базовый URL-адрес в файле config.php:

$config['base_url'] = 'http://www.mysites.com/site1/';

Мне пришлось добавить следующее в файл route.php внутри папки конфигурации CI:

$route['site1/index\.php/(:any)'] = "$1";
$route['site1/(:any)'] = "$1";

Даже после перенаправления Apache CI по-прежнему видит «site1» в URI и, следовательно, пытается загрузить контроллер «site1», которого явно не существует! второй $route[] убирает "site1".

Я также использую HybridAuth, который включает «index.php» в свои обратные вызовы, поэтому CI увидит его в URI и попытается загрузить контроллер «index.php», которого, очевидно, тоже не существует! first $route[] удаляет "site1/index.php".

Надеюсь, это поможет кому-то.

person ScottyB    schedule 19.11.2013