Проблема перенаправления URL-адресов CodeIgniter на WWW - PullRequest
1 голос
/ 30 июня 2011

У меня есть приложение CI, которое использует .htaccess для маршрутизации URL. Мои основные настройки следующие:

RewriteRule ^$ /var/www/html/ferdy/jungledragon/index.php [L]
RewriteCond $1 !^(index\.php|images|img|css|js|swf|type|themes|robots\.txt|favicon\.ico|sitemap\.xml)
RewriteRule ^(.*)$ /var/www/html/ferdy/jungledragon/index.php/$1 [L]

Эти правила довольно стандартны для приложений CI. Они переписывают все URL-адреса (кроме тех, которые указаны в списке исключений) на фронт-контроллере index.php. Вышеуказанные строки также скрывают index.php, так как он обычно отображается как часть каждого URL.

Пока все хорошо. Все работает просто отлично. Теперь, ради SEO, я хотел бы заставить весь трафик на www. Поэтому я расширил правила следующим образом:

Options +FollowSymlinks
RewriteEngine on

RewriteRule ^$ /var/www/html/ferdy/jungledragon/index.php [L]
RewriteCond $1 !^(index\.php|images|img|css|js|swf|type|themes|robots\.txt|favicon\.ico|sitemap\.xml)
RewriteRule ^(.*)$ /var/www/html/ferdy/jungledragon/index.php/$1 [L]

rewritecond %{http_host} ^jungledragon.com [nc]
rewriterule ^(.*)$ http://www.jungledragon.com/$1 [r=301,nc]

Эти две последние строки перезаписывают http://jungledragon.com/anything URL-адреса на http://www.jungledragon.com/anything URL-адреса. Это работает, но возвращает часть index.php: http://jungledragon.com/anything становится http://www.jungledragon.com/index.php/anything.

Как именно я комбинирую эти правила, чтобы они не мешали друг другу? Я пытался сделать WWW переписать до правил CI. Это показывает страницу Apache 301 с ошибкой, вместо фактического перенаправления.

Кроме того, я хотел бы также включить правила, чтобы избавиться от конечных слешей, но сейчас давайте оставим вопрос простым. Обратите внимание, что я нашел полезный пост здесь и в других местах, но по какой-то причине я все еще не могу найти правильный точный синтаксис для моей ситуации.

Редактировать: Спасибо за помощь. Это работает:

Options +FollowSymlinks
RewriteEngine on

rewritecond %{http_host} ^jungledragon.com [nc]
rewriterule ^(.*)$ http://www.jungledragon.com/$1 [r=301,nc,L]

RewriteRule ^$ /var/www/html/ferdy/jungledragon/index.php [L]
RewriteCond $1 !^(index\.php|images|img|css|js|swf|type|themes|robots\.txt|favicon\.ico|sitemap\.xml)
RewriteRule ^(.*)$ /var/www/html/ferdy/jungledragon/index.php/$1 [L]

1 Ответ

2 голосов
/ 30 июня 2011

mod_rewrite обрабатывает правила линейно.Правила в верхней части файла обрабатываются в первую очередь.

[nc] и [L] в конце правил - это варианты обработки правил.

  • nc- nocase : без учета регистра
  • L - last : последнее правило в выполнении (если вы нажмете это, остановите обработку)

Вам нужно поставить ваши правила www redirect выше ваших правил CI, чтобы он сначала добавил www, ТО затем примените правила CI к вновь переписанному URL.** А также используйте флаг C или N с вашим правилом www redirect, чтобы он анализировал следующее правило.

http://mysite.com/blah == становится ==> http://www.mysite.com/blah == становится==> http://www.mysite.com/index.php/blah (Выполнено, не перенаправлено)

В настоящее время происходит следующее:

http://mysite.com/blah == становится ==> http://mysite.com/index.php/blah (СТОП)

Браузер переходит на http://mysite.com/index.php/blah, и второй этап перезаписи выполняется, поскольку ваши исключения останавливают обработку /index.php URL-адресов

http://mysite.com/index.php/blah ==становится ==> http://www.mysite.com/index.php/blah (Перенаправлено)


Как предложено, вот ссылка на документацию mod_rewrite , если вы хотите посмотреть дальше.

@ LazyOne: Brainfart, извините.

Вот выдержка из документов, в которых указаны флаги, которые вам, вероятно, понадобятся:

'chain | C' (связан со следующим правилом) Этот флаг объединяет текущее правило со следующим правилом (которое само может быть связано со следующим правилом и т. Д.).Это имеет следующий эффект: если правило соответствует, тогда обработка продолжается как обычно - флаг не имеет никакого эффекта.Если правило не совпадает, то все последующие связанные правила пропускаются.Например, его можно использовать для удаления части .www'' part, inside a per-directory rule set, when you let an external redirect happen (where the .www '' не должно быть!).

'next | N' (следующий раунд) Перезапустить переписываниепроцесс (начиная снова с первого правила перезаписи).На этот раз сопоставляемый URL-адрес больше не является исходным URL-адресом, а скорее URL-адресом, возвращаемым последним правилом перезаписи.Это соответствует команде Perl next или continue на C. Используйте этот флаг, чтобы перезапустить процесс перезаписи - чтобы сразу перейти к началу цикла. Будьте осторожны, чтобы не создавать бесконечный цикл!

'nocase | NC' (без регистра) Это делает шаблон нечувствительным к регистру, игнорируя разницу между 'AZ'и 'az', когда шаблон сопоставляется с текущим URL.'noescape | NE' (нет выхода из URI). Этот флаг не позволяет mod_rewrite применять обычные правила выхода из URI к результату перезаписи.Обычно специальные символы (такие как «%», «$», «;» и т. Д.) Экранируются в их эквиваленты в шестнадцатеричном коде («% 25», «% 24» и «% 3B» соответственно);Этот флаг предотвращает это.Это позволяет символам процента появляться на выходе, как в

...