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

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

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]

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

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

Что я не правильно делаю?
 
Я тестик написала:
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]
 
Хм... хорошая идея.
Правда у меня пока не очень стабильно работает, но я думаю дальше разберусь. Спасибо

-~{}~ 29.08.05 16:26:

Вобщем с этой ситуацией вроде разобрался, а вот что касается амперсандов и выделение парметров... тут вообще не ясно.
Вопрос открыт
 
так как у тебя запросы раньше шли все через index.php
сделай просто
RewriteRule index.php - [L]
тогда все что началось с него реврайтица не будет и пойдет напрямую
 
не пойдет. Мне нужно сказать поисковому роботу, что такая страница теперь по другому адресу. Мне нужен правильный редирект со страрого адреса на новый
 
digs
А в чём проблема с амерсандами?
RewriteCond %{QUERY_STRING} sec=blog&foo=bar
RewriteRule ^index.php(.*)$ blog/bar [L]
 
svetasmirnova
Проблема с передачей параметра.
те. index.php?sec=blog&rcode=111
вот это 111 может быть любым
 
Тут понимаешь какое дело. Он ведь не видит того, что после ? Поэтому и не получается решить задачку "в лоб". Надо играться с переменными типа QUERY_STRING. Вот ещё один способ его обамнуть:
RewriteRule ^index.php(.*)$ index.php%{QUERY_STRING} [R]
RewriteRule ^ index.phpsec=blog&rcode=(.*)$ /blog/$1 [L]
 
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 убить
 
Вопщем разобрался с этим. 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]

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

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