mod_rewrite. Помогите с редиректом

digs

Новичок
mod_rewrite. Помогите с редиректом

Была раньше запись /index.php?sec=blog&ss=viewrec&rcode=00000011
при помощи реврайта привел к виду /blog/rec/00000011
все работает. Но у Рамблера сохранились старые ссылки и он индексирует по старым. Хочу перебрасывать его на новые.
Проблема в том, что либо я совсем не знаю реврайт, либо просто не знаю как правильно экранировать некоторые символы. Я пробовал так:

RewriteRule ^(index\.php\?sec=blog\&ss=viewrec\&rcode=)([0-9]+) /blog/rec/$1 [R=301]

не получилось. Смотрел поиск, но как точно найти не знаю. Если была такая тема, пошлите меня, либо помогите.
Спасибо
 

digs

Новичок
Спасибо конечно большое...
Но меня больше интересует не как писать внешний редирек, а как правильно экранировать управляющие символы.
вот такое правило уже не проходит

RewriteRule ^index.php\?sec=blog /blog [R=301]

Что я не правильно делаю?
 

svetasmirnova

маленький монстрик
Я тестик написала:
RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} action=path
RewriteRule ^some(.*)$ shtml2.shtml [L]

Для url http://127.0.0.5/some?action=path
Чтобы обработку ? обмануть.

Т.е. у тебя как-то так должно быть:
RewriteCond %{QUERY_STRING} sec=blog
RewriteRule ^index.php(.*)$ blog [L]
 

digs

Новичок
Хм... хорошая идея.
Правда у меня пока не очень стабильно работает, но я думаю дальше разберусь. Спасибо

-~{}~ 29.08.05 16:26:

Вобщем с этой ситуацией вроде разобрался, а вот что касается амперсандов и выделение парметров... тут вообще не ясно.
Вопрос открыт
 

kostya.sys

Guest
так как у тебя запросы раньше шли все через index.php
сделай просто
RewriteRule index.php - [L]
тогда все что началось с него реврайтица не будет и пойдет напрямую
 

digs

Новичок
не пойдет. Мне нужно сказать поисковому роботу, что такая страница теперь по другому адресу. Мне нужен правильный редирект со страрого адреса на новый
 

svetasmirnova

маленький монстрик
digs
А в чём проблема с амерсандами?
RewriteCond %{QUERY_STRING} sec=blog&foo=bar
RewriteRule ^index.php(.*)$ blog/bar [L]
 

digs

Новичок
svetasmirnova
Проблема с передачей параметра.
те. index.php?sec=blog&rcode=111
вот это 111 может быть любым
 

svetasmirnova

маленький монстрик
Тут понимаешь какое дело. Он ведь не видит того, что после ? Поэтому и не получается решить задачку "в лоб". Надо играться с переменными типа QUERY_STRING. Вот ещё один способ его обамнуть:
RewriteRule ^index.php(.*)$ index.php%{QUERY_STRING} [R]
RewriteRule ^ index.phpsec=blog&rcode=(.*)$ /blog/$1 [L]
 

digs

Новичок
svetasmirnova
Мне вообще сказали, что QUERY_STRING в RewriteRule не разбирается. Т.е. должна работать такая конструкция:

RewriteCond %{QUERY_STRING} ^sec=blog&ss=viewrec&rcode=([0-9]+)$
RewriteRule ^index.php$ blog/rec/%1 [R=301,L]

Но проблема вся в том, что она оставляет QUERY_STRING не тронутым, те. вместо жедаемого получается строка
/blog/rec/00000101?sec=blog&ss=viewrec&rcode=00000101

Я так подозреваю, что после редиректа, новый QUERY_STRING оказывается такой же, а новый адрес попадает под правило как index.php в каталоге /blog/rec/00000101, хотя физически такого каталога нет. Поэтому происходит зацикливание. Я пробовал в RewriteRule добавлять опцию E=QUERY_STRING:'' , но эта конструкция не сработала. Вобщем надо как то этот QUERY_STRING убить
 

svetasmirnova

маленький монстрик
Она убивается, если написать fake вроде:
RewriteRule ^index.php(.*)$ needed?fake
 

digs

Новичок
Вопщем разобрался с этим. fake писать не надо. Надо просто вопросительный знак и все.
Проблема теперь в другом. Теперь конфликт двух правил.
Первое, то что мы рассматриваем, второе, преобразующее статику в динамику.
Сначала срабатывает первое, потом второе, потом опять первое и т.д. В итоге происходит зацикливание. Пробовал указать первому правилу не выполняться в случае внутреннего подзапроса, но это видимо не то...

-~{}~ 30.08.05 09:12:

svetasmirnova
Хех..
Вобщем нашел выход из ситуации
В правиле
RewriteRule ^blog/rec/([0-9]+)$ /index.php?sec=blog&ss=viewrec&rcode=$1 [L]

просто поменял местами две первые переменные. Получил:

RewriteRule ^blog/rec/([0-9]+)$ /index.php?ss=viewrec&sec=blog&rcode=$1 [L]

В итоге обсуждаемый запрос перестал такую строку обрабатывать :)

Спасибо!
 
Сверху