В который раз застрял с 301 редиректом в htaccess

P
На сайте с 02.04.2015
Offline
9
1556

Всем привет!

Казалось бы всё просто - надо обрезать URL начиная с определенной подстроки (ссылка с яндекс.маркета), но на практике затык :(

Исходный URL имеет следующий вид

http://sitename.ru/product_name1.html?_openstat=bWFya2V0LnlhbmRlw&frommarket=https%3A//market.yandex.ru/search.xml%3Finshopname%3Dsitename.ru%26fesh%3D921381%26free%3D1&ymclid=63237848425050889001

Надо обрезать всё после "?_openstat"

и в итоге получить такой адрес для редиректа:

http://sitename.ru/product_name1.html

Максимум до чего дошел это вот:

RewriteRule (.+?)\.openstat.+ http://%{HTTP_HOST}/1 [L,R=301]

RedirectMatch permanent (.+?)\openstat.+$ http://sitename.ru$1

Но эти правила срабатывают, только если убрать знак вопроса внутри "?_openstat", т.е. на таком URL'е только это работает.

http://sitename.ru/product_name1.html_openstat=bWFya2V0LnlhbmRlw&frommarket=https%3A//market.yandex.ru/search.xml%3Finshopname%3Dsitename.ru%26fesh%3D921381%26free%3D1&ymclid=63237848425050889001

Тогда формируется нормальный редирект на

http://sitename.ru/product_name1.html

А вот как переделать правила для того, чтобы обрабатывать это "?_openstat" не понимаю...

Прошу не дать пропасть в помешательстве...

Спасибо

H
На сайте с 08.02.2016
Offline
7
#1

Pekkonen, вы хотите обрезать ссылку редиректом для того, чтобы она стала ЧПУ-url? Если так, то не легче использовать специальные компоненты для этого, которые на автомате переделывают такие url?

P
На сайте с 02.04.2015
Offline
9
#2
Hanke:
Pekkonen, вы хотите обрезать ссылку редиректом для того, чтобы она стала ЧПУ-url? Если так, то не легче использовать специальные компоненты для этого, которые на автомате переделывают такие url?

У сожалению ЧПУ тут не помогут, нужно убрать часть адреса именно через htaccess

J
На сайте с 20.02.2014
Offline
120
jkm
#3


RewriteCond %{QUERY_STRING} ^_openstat
RewriteRule ^(.*)$ /$1? [R=301,L]


---------- Добавлено 19.02.2016 в 14:05 ----------

В RewriteRule попадает не вся ссылка, а только путь к файлу. Аргументы переносятся в %{QUERY_STRING}
P
На сайте с 02.04.2015
Offline
9
#4
jkm:

RewriteCond %{QUERY_STRING} ^_openstat
RewriteRule ^(.*)$ /$1? [R=301,L]

Благодарю за участие!

Истина где-то рядом, но снова не могу понять в чем дело...

Предложенный вами вариант срабатывает на другом сайте, но на этом ему что-то мешает, и в результате получаю неправильный адрес :(

Может быть всё таки получится модернизировать это:

RewriteRule (.+?)\.openstat.+ http://%{HTTP_HOST}/1 [L,R=301]

RedirectMatch permanent (.+?)\openstat.+$ http://sitename.ru$1

Я немного ошибся в первом посте и этот редирект

Но эти правила срабатывают, только если убрать знак вопроса внутри "?_openstat", т.е. на таком URL'е только это работает.

http://sitename.ru/product_name1.html_openstat=bWFya2V0LnlhbmRlw&frommarket=https%3A//market.yandex.ru/search.xml%3Finshopname%3Dsitename.ru%26fesh%3D921381%26free%3D1&ymclid=63237848425050889001

Такой редирект:

http://sitename.ru/product_name1.html_

С подчеркиванием на конце URL'a.

J
На сайте с 20.02.2014
Offline
120
jkm
#5
Pekkonen:

Может быть всё таки получится модернизировать это:
RewriteRule (.+?)\.openstat.+ http://%{HTTP_HOST}/1 [L,R=301]

RedirectMatch permanent (.+?)\openstat.+$ http://sitename.ru$1

Нет, не получится.

Redirect и RedirectMatch это директивы mod_alias. Всё что после знака вопроса не участвует в сравнении с шаблоном.

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

Такая возможность есть у mod_rewrite. Но это делается не через RewriteRule, а конструкциями

RewriteCond %{QUERY_STRING}

или

RewriteCond %{THE_REQUEST}

Pekkonen:
Предложенный вами вариант срабатывает на другом сайте, но на этом ему что-то мешает, и в результате получаю неправильный адрес :(

Порядок расположения правил имеет значение. Результат работы правил влияет на последующие правила.

Поэтому редиректы должны срабатывать до того как другие правила что-нибудь поменяют.

Ставьте редирект в самом верху сразу после RewriteEngine On

P
На сайте с 02.04.2015
Offline
9
#6
jkm:

Порядок расположения правил имеет значение. Результат работы правил влияет на последующие правила.
Поэтому редиректы должны срабатывать до того как другие правила что-нибудь поменяют.
Ставьте редирект в самом верху сразу после RewriteEngine On

Еще раз спасибо!

Я в курсе этого, но тут мне надо победить внутренние редиректы Magento, которые сейчас срабатывает не к месте, и являются системными (создаются в Magento автоматически)

Отсюда и вся эта свистопляска...

Тогда переформулирую вопрос - возможно ли добавить перед этими правилами

RewriteRule (.+?)\.openstat.+ http://%{HTTP_HOST}/1 [L,R=301]

RedirectMatch permanent (.+?)\openstat.+$ http://sitename.ru$1

Еще одно, которое будет вырезать из адреса конкретное сочетание ?_?

И дальше уже из обрезанного адреса буду вырезать openstat

Извиняюсь за сумбур, но другие решения как победить это в голову не приходят.

J
На сайте с 20.02.2014
Offline
120
jkm
#7

А чем не устраивал предложенный вариант.

Если нужен редирект на адрес с символом подчеркивания в конце http://sitename.ru/product_name1.html_, то нужно исправить /$1? на /$1_?


RewriteCond %{QUERY_STRING} ^_openstat
RewriteRule ^(.*)$ /$1_? [R=301,L]
P
На сайте с 02.04.2015
Offline
9
#8
jkm:
А чем не устраивал предложенный вариант.

Если вы про ваш вариант

RewriteCond %{QUERY_STRING} ^_openstat

RewriteRule ^(.*)$ /$1? [R=301,L]

То он в моих конкретных условиях почему то не спасает, хотя сам редирект работает верно.

После вставки этого редиректа не происходит главного - по каким то причинам ссылка идет на ошибку (срабатывают внутренние редиректы из Magento)

Поэтому я и пытаюсь обойти эти внутренние редиректы через htaccess.

Редирект на ссылку с _ не нужен, т.к. правильная ссылка именно

http://sitename.ru/product_name1.html

Поэтому я и предполагаю что тут может подойти 2-х ходовка

Сначала вырезаем из URL символы ?_

А потом уже обрезаем всё лишнее (начиная с openstat)

Хотя уверенности, что это будет работать как надо у меня уже немного...

J
На сайте с 20.02.2014
Offline
120
jkm
#9

Ну, если редирект работает верно, но Magento показывает ошибку, то даже если сначала вырезаем из URL символы ?_, а потом уже обрезаем всё лишнее (начиная с openstat).

В итоге после перехода на верный адрес Magento точно также покажет ошибку.

Сначала нужно разобраться, почему происходит ошибка, если отрывать страницу


http://sitename.ru/product_name1.html
P
На сайте с 02.04.2015
Offline
9
#10
jkm:
Сначала нужно разобраться, почему происходит ошибка, если отрывать страницу

http://sitename.ru/product_name1.html

Ссылка на товар открывается без проблем и нормально работает.

Проблемы возникают из-за параметров, которые привязываются к ссылкам на стороннем сервере (яндекс.маркет)

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