301 Редирект динамических страниц

123
siv1987
На сайте с 02.04.2009
Offline
427
#11
bon_eur:
ivan-lev, Rulin, siv1987, все же лучше не забывать в регулярных выражениях перед точкой ставить бэкслэш.

Я об экранированию не забываю, а если здесь даже и не указал, то ничего страшного не будет.

RewriteRule ^str_postart.php\?id=47$ /str_postcat.php?id=187 [L]
Почему то не работает.

И не будет работать. Используйте другой пример

RewriteCond %{QUERY_STRING} ^id=47$

RewriteRule ^str_postart\.php /str_postcat.php?id=187 [R=301,L]

Rulin
На сайте с 16.01.2008
Offline
143
#12

Покажи весь .htaccess, возможно правило размещено в неправильном месте после обработки правила при котором срабатывает 404 ошибка

Bitcoin Debit Card
bon_eur
На сайте с 09.06.2012
Offline
40
#13
splish:
RewriteRule ^str_postart.php\?id=47$ /str_postcat.php?id=187 [L]
Почему то не работает.

Вот наглядный пример.

http://world-networks.ru/view_posth.php?id=47 Страница удалена, нужно перенаправить с сохранением PR на:
http://world-networks.ru/view_post.php?id=189

Держите быстрый и надежный код.

RewriteCond %{REQUEST_URI} =/view_posth.php
RewriteCond %{QUERY_STRING} =id=47
RewriteRule . /view_post.php?id=189 [R=301,L]

Я проверил - у меня работает.

Rulin
На сайте с 16.01.2008
Offline
143
#14
bon_eur:
Я проверил - у меня работает.

Ваше правило сработает в ложных случаях, например если id=470 или 47 + любое число, чего быть не должно

Такой вариант будет более правильный:

RewriteCond %{REQUEST_URI} ^\/view_posth\.php

RewriteCond %{QUERY_STRING} id=47$
RewriteRule . /view_post.php?id=189 [L]
splish
На сайте с 25.01.2011
Offline
114
#15
bon_eur:
Держите быстрый и надежный код.

Код:
RewriteCond %{REQUEST_URI} =/view_posth.php
RewriteCond %{QUERY_STRING} =id=47
RewriteRule . /view_post.php?id=189 [R=301,L]
Я проверил - у меня работает.

Огромное спасибо!

bon_eur
На сайте с 09.06.2012
Offline
40
#16
ivan-lev:
Если только для id=1
RewriteCond %{QUERY} id=1$

RewriteRule ^str_post1.php str_post2.php [R=301,L,QSA]

Переменной QUERY в мануале не нашел. Неужели у вас этот код работает?

Rulin:
Если только для конкретных id, а не динамически для всех, тогда так:

RewriteRule ^str_postart.php\?id=47$ /str_postcat.php?id=187 [R=301,L]


Динамически так, но тогда id будут совпадать, а я так понял они у вас разные:

RewriteRule ^str_postart.php\?id=(\d+)$ /str_postcat.php?id=$1 [R=301,L]


Или нужен внутренний редирект? Чтоб урл остался site.ru/str_postart.php?id=47 но показывалось содержимое site.ru/str_postcat.php?id=187 тогда так:


RewriteRule ^str_postart.php\?id=47$ /str_postcat.php?id=187 [L]

Неужели у вас эти три кода работают? Все, что после знака вопроса не должно матчить в паттерне. Из мануала: "The Pattern will not be matched against the query string."

Кроме того, во втором коде используется \d+, что тоже не должно работать в .htaccess. Вы не с php, случаем, перепутали? ;)

---------- Добавлено 01.07.2012 в 15:52 ----------

Rulin:
Ваше правило сработает в ложных случаях, например если id=470 или 47 + любое число, чего быть не должно

А вы проверьте - не будет ложных срабатываний ;)

Дело в том, что при таком синтаксисе, как RewriteCond %{QUERY_STRING} =id=47, CondPattern обрабатывается не как регулярное выражение. Идет тупое и быстрое сравнение на точное соответствие строке.

Это все из мануала.

Rulin
На сайте с 16.01.2008
Offline
143
#17
bon_eur:

Неужели у вас эти три кода работают? Все, что после знака вопроса не должно матчить в паттерне. Из мануала: "The Pattern will not be matched against the query string."

Кроме того, во втором коде используется \d+, что тоже не должно работать в .htaccess. Вы не с php, случаем, перепутали? ;)

Каюсь немного напутал c RewriteRule, у него в первом параметре не может быть query, его можно только через переменные получить, но \d+ у меня в .htaccess без проблем работает т.к. со второй версии apache почти полностью поддерживает perl совместимые регулярки

bon_eur
На сайте с 09.06.2012
Offline
40
#18
Rulin:
но \d+ у меня в .htaccess без проблем работает т.к. со второй версии apache почти полностью поддерживает perl совместимые регулярки

Спасибо за информацию. У меня на nginx, например, не работает - специально только что проверил.

Rulin
На сайте с 16.01.2008
Offline
143
#19
bon_eur:

Дело в том, что при таком синтаксисе, как RewriteCond %{QUERY_STRING} =id=47, CondPattern обрабатывается не как регулярное выражение. Идет тупое и быстрое сравнение на точное соответствие строке.

Это все из мануала.

Ох черт, сказывается долгое не писание правил для htaccess, совсем забыл, действительно вы правы так оно и есть

---------- Добавлено 01.07.2012 в 16:09 ----------

bon_eur:
Спасибо за информацию. У меня на nginx, например, не работает - специально только что проверил.

Перепроверил у меня работает: Apache/2.2.16 + nginx/0.8.29

http://httpd.apache.org/docs/current/rewrite/intro.html#regex

mod_rewrite uses the Perl Compatible Regular Expression vocabulary
IL
На сайте с 20.04.2007
Offline
435
#20

> Переменной QUERY в мануале не нашел. Неужели у вас этот код работает?

Нет, конечно.. QUERY_STRING должно было быть.. Хотя, в любом случае, Ваш вариант с равенством более корректен.

p.s. Обычно, такого рода редиректов "без закономерностей" на сайте получается относительно много - выношу их в скрипт - формирую массив вида 'откуда'=>'куда', и, в зависимости от значения $_SERVER['REQUEST_URI'], кидаю редирект.

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий