.htaccess - RewriteRules работает, но в адресной строке браузера отображается полный (недружественный) URL - PullRequest
3 голосов
/ 09 апреля 2010

Не удалось найти решение этой проблемы в сети или на этих форумах - извинитесь, если я что-то пропустил!

Мои .htaccess RewriteRules работают хорошо - на моих веб-страницах имеются ссылки для поисковых систем и удобные для пользователя ссылки, а недействительные URL-адреса баз данных скрыты в фоновом режиме.

За исключением случаев, когда я добавил RewriteRule для добавления "www." перед URL-адресами, если пользователь их не вводил - чтобы убедиться, что в поисковых системах отображается только один. Вот что сейчас происходит, и я не могу понять, почему!

Моя дружественная структура URL для контента выглядит следующим образом, а в строке запроса базы данных используется первое «важное слово»:

www.example.com/importantword-nonimportantword/

.htaccess фрагмент:

Options +FollowSymLinks
Options -Indexes

RewriteEngine on
RewriteOptions MaxRedirects=10

RewriteBase /

RewriteRule ^/$ index.php [L]

RewriteRule ^(.*)-(.*)/overview/$ detail.php?categoryID=$1 [L]

RewriteCond %{HTTP_HOST} !^www.example.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [L]

Что происходит с тех пор, как я добавил последние 2 строки:

СЛУЧАЙ 1: типы пользователей (или клики) www.example.com/honda-vehicle/overview/
- работает правильно
- Они выводятся на правильную страницу, а в строке URL браузера указывается:

www.example.com/honda-vehicles/overview/

Случай 2: пользовательские типы example.com
- работает правильно
- Они перенаправляются на сайт www.example.com, а в строке URL браузера указывается:

www.example.com

Случай 3: пользовательские типы (или клики) example.com/honda-vehicles/overview/, т.е. без префикса "www"
- НЕ работает правильно
- Они переносятся на нужную страницу, но в строке URL браузера отображается недружественный URL:

www.example.com/detail.php?categoryID=honda 

Я полагаю, что есть какая-то проблема с порядком RewriteRules, но он пытается изо всех сил попытаться логически пройтись по нему и выяснить это!

Любая помощь или указатели были бы очень признательны!

1 Ответ

1 голос
/ 09 апреля 2010

Правила применяются в порядке их появления. Это означает, что при запросе honda-vehicles/overview/ применяется ваше второе правило, переписывающее путь к detail.php?categoryID=honda. А из-за флага L текущий процесс перезаписи немедленно останавливается, но также перезапускается с новым URL, в результате чего теперь применяется третье правило.

Вы можете это исправить, просто изменив порядок. Поместите свое последнее правило в качестве первого (и добавьте флаг R ):

RewriteCond %{HTTP_HOST} !^www.example.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

Основное правило заключается в том, чтобы поместить те правила, которые вызывают внешнее перенаправление, перед этими правилами, которые просто вызывают внутреннее переписывание.

...