mode_rewrite Проблема с {QUERY_STRING}

-faqer-

Я только учусь
mode_rewrite Проблема с {QUERY_STRING}

Свои чпу виде folder1/folder2/folder3 на сайте организовываю след образом
.htaccess
PHP:
### Autogenerated directives. Please, DON'T EDIT! ###
### Directives added by user ###
DirectoryIndex index.html index.php index.htm


RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^([^\.]*)$ /index.php?rewrite_path=$1&rewrite_query=%{QUERY_STRING} [L]
index.php
PHP:
$rewrite_path = (isset ($_GET ['rewrite_path'])) ? ((ereg ('/$', $p = ereg_replace ("[^/a-z0-9_-]", "", $_GET ['rewrite_path']))) ? '/'.$p : '/'.$p.'/') : false;
$rewrite_query = (isset ($_GET ['rewrite_query'])) ? $_GET ['rewrite_query'] : false;
$rewrite_query писал про запас, она вообщем-то никогда не была нужна

Проблем никаких не было, пока не пришлось в этих "папках" использовать формы
ну допустми так /folder/?a=1&b=2&c=3
и вот что мне выдает print_r ($_GET) в таком случае

PHP:
Array
(
    [rewrite_path] => folder/
    [rewrite_query] => a=1
    [b] => 2
    [c] => 3
)
А мне нужно

PHP:
Array
(
    [rewrite_path] => folder/
    [a] => 1
    [b] => 2
    [c] => 3
)
Черт с ним с тем rewrite_query. Не нужен он мне а нужно мне все параметры в GET нормально заганать, но никак не получается.
Помогите, пжлст
 

kstati

Новичок
Это не глюк, а точное выполнение правила, которое ты назначил.
Решение под носом.
Чтобы понять его, подмени-ка на время index.php
PHP:
<pre><?=$_SERVER['QUERY_STRING'];?></pre>
Посмотри на вывод, и с легкостью в душе найди правильное решение. ;)
 

-faqer-

Я только учусь
Рожденный ползать летать не будет
Наверное, моя тупость не дает мне понять такую вещь как mode_rewrite

Сколько ни смотрел в <pre><?=$_SERVER['QUERY_STRING'];?></pre> проблему не решил
Решил ее другим методом
PHP:
RewriteRule ^([^.]*)$ /index.php?rewrite_path=$1 [QSA]
Теперь работает. Правда не совсем понимаю как:)
2 kstati
Если не затруднит, объясните,пжлст, что вы мне пытались сказать
А то я скоро уже комплексовать с этим mode_rewrite буду. Вообще уже себя дауном считаю:(
 

kstati

Новичок
Сложно описывать то, что считаешь элементарным, как таблицу умножения, но попробую.
Правило RewriteRule состоит из четырех частей
КлючевоеСлово(RewriteRule) ЧтоИскать(ВВидеРегЭкспа) НаЧтоМенять Флаги

ModRewrite разбивает URL на части, соответствующие стандарту rfc 1738.


В третьем столбце правила (НаЧтоМенять) создается новая строка запроса.
в $1 помещается первая выбранная часть пути (в данном случае - это весь путь), а %{QUERY_STRING} содержит параметры, которая в "готовом" виде выглядит как
/index.php?rewrite_path=folder/&rewrite_query=a=1&b=2&c=3


Если вспомнить (иначе надо обязательно изучить) правила составления GET-параметров запроса, (что имя переменной и значение разделяются знаком =, группы этих последовательностей разделителем - & ), то станет очевидным, что в index.php передаются четыре переменные вместо ожидаемых пяти.

MyServer/index.php?rewrite_path=folder/&rewrite_query=a=1&b=2&c=3


Одним из правильных решений может быть приписка %{QUERY_STRING} к "НаЧтоМенять" через символ & :
RewriteRule ^([^.]*)$ /index.php?rewrite_path=$1&%{QUERY_STRING}

Другим - использование флага [QSA]
Который указывает ModRewrite что параметры в заменяемой части URL надо добавлять, а не заменять.

тогда созданный запрос будет соответсвовать необходимым требованиям - index.php получит rewrite_path и все другие переменные.
/index.php/?rewrite_path=folder/&a=1&b=2&c=3

А если требуется исходная строка запроса, то ее можно найти, изучив мануал по Предопределенным переменным PHP
$_SERVER['REQUEST_URI']
 
Сверху