Почему бы mod_rewrite переписать дважды? - PullRequest
1 голос
/ 01 февраля 2009

Я только недавно узнал о перезаписи URL , поэтому мне еще многое предстоит узнать.

Следуя учебному пособию Easy Mod Rewrite , результаты одного из их примеров меня действительно смущают.

RewriteBase /
RewriteRule (.*) index.php?page=$1 [QSA,L]

Переписывает /home как /index.php?page=index.php&page=home.

Я думал, что дубликаты могли быть вызваны чем-то в конфигах моего хоста, но чистая установка XAMPP делает то же самое.

Так, кто-нибудь знает, почему это, кажется, анализирует дважды?

И мне кажется, что если это будет сделано, это будет бесконечный цикл - почему он останавливается на 2 циклах?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2009

Из документации модуля Apache mod_rewrite :

'last | L' (последнее правило)
[…] Если RewriteRule генерирует внутреннее перенаправление […], это приведет к повторному отклонению запроса и повторит обработку, начиная с первого RewriteRule.

Чтобы предотвратить это, вы можете использовать дополнительную директиву RewriteCond:

RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule (.*) index.php?page=$1 [QSA,L]

Или вы изменяете шаблон, чтобы он не соответствовал index.php, и используете переменную REQUEST_URI, либо в редиректе, либо позже в PHP ($_SERVER['REQUEST_URI']).

RewriteRule !^index\.php$ index.php?page=%{REQUEST_URI} [QSA,L]
2 голосов
/ 01 февраля 2009

Из примера 1 на этой странице , которая является частью учебника, связанного с вашим вопросом:

Предположим, вы используете систему CMS, которая переписывает запросы на все в один скрипт index.php.

RewriteRule ^(.*)$ index.php?PAGE=$1 [L,QSA]

Тем не менее, каждый раз, когда вы запускаете его, независимо от того, какой файл вы запрашиваете, переменная PAGE всегда содержит «index.php».

Почему? Вы закончите делать две переписки. Во-первых, вы запрашиваете test.php . Это будет переписано в index.php? PAGE = test.php . Второй запрос теперь делается для index.php? PAGE = test.php . Это по-прежнему соответствует вашему шаблону перезаписи и, в свою очередь, переписывается в index.php? PAGE = index.php .

Одним из решений было бы добавить RewriteCond, который проверяет, является ли файл "index.php". Лучшее решение, которое также позволяет вам хранить изображения и CSS-файлы в одном каталоге, - это использовать RewriteCond, который проверяет, существует ли файл, используя -f.


1 ссылка на Интернет-архив, так как веб-сайт учебного пособия, кажется, отключен

...