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

  • Автор темы Автор темы -faqer-
  • Дата начала Дата начала

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

Посмотри на вывод, и с легкостью в душе найди правильное решение. ;)
 
Рожденный ползать летать не будет
Наверное, моя тупость не дает мне понять такую вещь как mode_rewrite

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