Что происходит с моим mod_rewrite? - PullRequest
2 голосов
/ 06 сентября 2011

На моем сайте настроена простая система mod_rewrite, которая в основном конвертирует

http://site.com/file -> http://site.com/file.php

Вот файл .htaccess

Options -MultiViews
RewriteEngine On

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z]+)/?$ http://site.com/$1.php [L]

Это работало долгое время, а затем пару дней назад я понял, что во время работы RewriteRule он фактически менял мой URL в строке состояния.

Например, он перенаправил бы / photos в /photos.php, но также изменил бы URL, чтобы показать .php. Этого никогда не случалось раньше, и я не уверен, что случилось, чтобы вызвать изменения.

Есть идеи?

1 Ответ

3 голосов
/ 06 сентября 2011

Первое правило перезаписи требует флаг [L]. Из документации mod_rewrite для флага [R] :

Вы почти всегда захотите использовать [R] в сочетании с [L] (то есть использовать [R, L]), поскольку сам по себе флаг [R] добавляет http://thishost[:thisport] к URI, но затем передает это следующему правилу в наборе правил, что часто может привести к предупреждению «Неверный URI в запросе».

В этом случае вы не получите предупреждение, но добавление расширения «.php» происходит перед отправкой перенаправления, а не при поступлении второго перенаправленного запроса.

Кроме того, удалите схему и имя домена из подстановки во втором правиле перезаписи. Полный URL может вызвать неявное перенаправление. Из документации на RewriteRule:

Замена 1019 * правило перезаписи - это строка, которая заменяет исходный URL-путь, который было сопоставлено Pattern . Замена мая быть:

[...]
Абсолютный URL
Если указан абсолютный URL, mod_rewrite проверяет, является ли имя хоста соответствует текущему хосту. Если это так, схема и имя хоста удаляется, а полученный путь обрабатывается как URL-путь. В противном случае внешнее перенаправление выполняется для данный URL. Для принудительного внешнего перенаправления обратно на текущий хост, см. флаг [R] ниже.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...