Бесконечный цикл на комбинации RewriteRules - PullRequest
0 голосов
/ 19 января 2010

Итак, я настраиваю SVN на своем домашнем сервере (Ubuntu 9.1) и хочу немедленно просмотреть любые изменения, внесенные в мое приложение CodeIgniter.

Итак, моя рабочая копия находится в /home/myname/environments/development/appname.

Мой Vhost доступен по адресу dev.appname.myname.ca, и конфигурация выглядит следующим образом:

 DocumentRoot /home/myname/environments/development/
 ServerName dev.myname.ca
 ServerAlias dev.*.myname.ca

 RewriteEngine On
 RewriteCond %{HTTP_HOST} !^www.* [NC]
 RewriteCond %{HTTP_HOST} ^dev.([^\.]+)\.myname\.ca
 RewriteCond /home/myname/environments/development/%1/trunk/ -d
 RewriteRule ^(.*) /%1/trunk/public/$1

Итак, переход на dev.appname.myname.ca будет указывать на /home/myname/environments/development/appname/trunk/public.

.

Теперь, поскольку это приложение CodeIgniter, мне нужно перенаправить все запросы из public / в public / index.php, поэтому файл .htaccess в public / выглядит следующим образом:

RewriteEngine On
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php/$1 [L]

У меня есть эта часть в файле .htaccess, потому что на работающем производственном сайте у меня не будет доступа к конфигурации сервера, поэтому мне нужно переопределить ее.

Проблема теперь в том, что я получаю цикл перенаправлений и, в конечном счете, ошибку 500.

Из /var/log/apache2/error.log:

redirected from r->uri = /appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/

Как я могу перенаправить запрос в соответствующий каталог public / (в этом случае / home / myname / environment / development / appname / trunk / publc) и ТОГДА направить все запросы из public / в public / index.php?

Я знаю, что это сложный вопрос - спасибо за вашу помощь. :)

Ответы [ 3 ]

1 голос
/ 19 января 2010

Ваш RewriteRule отстал от того, что вы на самом деле хотите.

RewriteRule ^(.*)$ index.php/$1 [L]

Это превратит «dirA / dirB / dirC /» в «index.php / dirA / dirB / dirC». В последующем HTTP-запросе это будет удовлетворять условию, и правило будет применено снова. И снова, и снова ...

Попробуйте:

RewriteRule ^(.*)\/?$ $1/index.php [L]
0 голосов
/ 19 января 2010

Как сказал Фил, вы должны использовать правила переписывания здесь http://codeigniter.com/wiki/mod_rewrite/

Для некоторой отладки вы можете добавить следующие строки в ваш httpd.conf или виртуальный хост conf.

<IfModule mod_rewrite.c>
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
</IfModule>

С

tail -f /var/log/apache2/rewrite.log

Вы можете проверить правила переписывания и некоторые ошибки. Вы также можете изменить уровень на 9. Позаботьтесь об этом. Это производит много информации. Это иногда очень полезно.

0 голосов
/ 19 января 2010

Попробуйте использовать что-то немного менее безумное, вам не нужно перенаправлять из public / в public / index.php, поскольку Apache сделает это за вас.

Вики CodeIgniter показывает, как создатьокончательный CodeIgniter .htaccess .

...