MrNix21
@MrNix21

Как в htaccess сделать редирект по регулярному выражению?

Здравствуйте! Есть сайт на CMS ocStore 2.3. Мне нужно сделать 301ые редиректы с таких адресов:
https://site.ru/index.php?route=product/product&path=76&product_id=894/specification

на такие адреса:
https://site.ru/index.php?route=product/product&path=76&product_id=894

Значения 76, 894 меняются в зависимости от категории и товара. Также, после product_id=894/ могут быть любые значения.
Т.е. мне нужно сделать редирект во всех случаях, если после product_id=894 есть какое-то значение.
Что-то типа такого:
Redirect 301 /index.php?route=product/product&path=[0-9]&product_id=[0-9]/[0-9 a-z] /index.php?route=product/product&path=[0-9]&product_id=[0-9]

Но как это правильно написать в htaccess?
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
shambler81
@shambler81 Куратор тега htaccess
По идее это должно было быть вот так
RewriteCond %{QUERY_STRING} (?:^|&)route\=product/product(?:$|&)
RewriteCond %{QUERY_STRING} (?:^|&)path\=([0-9]+)(?:$|&)
RewriteCond %{QUERY_STRING} (?:^|&)product_id\=([0-9]+)/specification(?:$|&)
RewriteRule ^index\.php$ /index.php?route=product/product&path=%1&product_id=%2 [L,R=301]


Где %1 и %2 это аналог $1 и $2 из RewriteRule
но проблема в том что у тебя два запроса и тут придется делать это как-то по другому поскольку сработает толкьо $1 и будет он 894 поскольку группы из предидущего конда будут стерты.

так что думаю это можно сделать или через %{THE_REQUEST}
где можно выделить сразу оба параметра
Ну или просто в 404.php поставить регулярку.
Так будет даже наверное лучше, только чтоб 404 отдало после регулярки а не до .

тут я более детально описывал как это сделать.
но товарищ говорит что у него не заработало, хотя у меня на тесте все работало, почитай там в коментах я давал более правильный ответ.
https://qna.habr.com/q/1041262#answer_2012466
если не получится, то пиши придётся создавать тестовой стенд ;)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dodo512
если после product_id=894 есть какое-то значение

Это product_id=[0-9]+[^0-9] или product_id=\d+\D
В простейшем случае если параметры всегда идут строго в одном порядке можно сделать так:
RewriteCond %{QUERY_STRING} ^(route=product/product&path=\d+&product_id=\d+)\D
RewriteRule ^index\.php$ /index.php?%1 [R=301,L]


Если параметры могут быть в произвольном порядке.
RewriteCond &%{QUERY_STRING}& ^(?=.*&(route=product/product)&)(?=.*(&path=\d+)&)(?=.*(&product_id=\d+)[^&\d])
RewriteRule ^index\.php$ /index.php?%1%2%3 [R=301,L]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы