mod_rewrite передаёт параметр 2 раза

vjs

Новичок
mod_rewrite передаёт параметр 2 раза

Задача такая, mod_rewrite должен все запросы переводить на один скрипт и в качестве параметров передавать ему следующее:
1. url=ссылку к запрашиваемой странице
2. Все параметры которые были переданы с запрашиваемой страницей

Пробую решить её так.

В .htaccess пишу:
RewriteEngine On
RewriteRule ^(.*)$ index.php?url=$1&%{QUERY_STRING} [L]

В index.php пишу:
PHP:
<?php echo $_SERVER['QUERY_STRING']; ?>
Набираю в браузере http://localhost/test.php?id=1.
Подмена ссылки проходит и вот какой результат выдаёт index.php:
url=index.php&url=test.php&id=1

Почему то параметр url передаётся два раза, причём в первом значение имя скрипка на который происходила переадресация.

Подскажите, пожалуйста, где ошибка и как её исправить.
 

zerkms

TDD infected
Команда форума
RewriteCond %{SCRIPT_FILENAME} !-f

или проверять что имя не index.php

mod_rewrite переписывает урл до тех пор, пока он переписывается. другими словами:

1. ты делаешь запрос http://localhost/test.php?id=1
2. он твоим правилом переписывается в:
http://localhost/index.php?url=test.php&id=1
3. т.к. шаг 2 модифицировал урл - модреврайт переписывает его ещё раз в:
http://localhost/index.php?url=index.php&url=test.php&id=1
4. т.к. шаг 3 модифицировал урл - модреврайт переписывает его ещё раз в:
http://localhost/index.php?url=index.php&url=test.php&id=1
5. т.к. урлы после 3 и 4 одинаковые - mod_rewrite прекращает свою работу и передаёт управление дальше

ps: в каждом шаге жирным выделена часть, которая на следующем шаге будет подставлена в %{QUERY_STRING}
pps: [L], который ты поставил, вероятно, чтобы это победить, просто прекращает ДАЛЬНЕЙШУЮ проверку правил НА ЭТОЙ ИТЕРАЦИИ, но не исключает последующие итерации.
 

vjs

Новичок
zerkms
Спасибо большое за подробное разъяснение!
 
Сверху