Редирект при настройке ЧПУ вукомерсс

Настроил ЧПУ редирект происходит почти везде, но для страниц товаров почему-то не срабатывает

настройки постоянных ссылок следующие:

Общие настройки
Произвольно: /%postname%/

Дополнительно
База категорий товара: product-category
База меток товара: product-tag

Постоянные ссылки товаров
Произвольная база: /product/

Вид ссылок сейчас, действуют оба вида:

старая ссылка https://banzai-sport.com/?product=zhilet-utyazhelitel-kompakt-2-20-kg-razmer-44-48

новая ссылка https://banzai-sport.com/product/zhilet-utyazhelitel-kompakt-2-20-kg-razmer-44-48/

нашел такой вариант для установки редиректа

# Внешний редирект клиента со старых динамических URL на новые статические
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\
/index\.php\?product=([^&]+)&color=([^&]+)&size=([^&]+)&texture=([^&]+)&maker=([^\ ]+)\ HTTP/
RewriteRule ^index\.php$ //example.com/product/%1/%2/%3/%4/%5? [R=301,L]

но данный редирект для таких ссылок:

Старый динамический формат URL:

index\.php?product=widget&color=blue&size=small&texture=fuzzy&maker=widgetco

Новый статический формат URL:

/product/widget/blue/small/fuzzy/widgetco

а у меня такой:

Старый динамический формат URL:

/?product=bla-bla-bla

Новый статический формат URL:

/product/bla-bla-bla/

прочитав, что не правильное введение правил в .htaccess может повлечь нарушения в работе, я не стал экспериментировать на рабочем сайте

подскажите как правильно прописать редирект.

1
earlnik
8 лет назад 4
  • 0
    Zero 27

    Если применительно конкретно к вашему сайту banzai-sport, т.е. после доменного имени будет сразу идти единственный get параметр, то можете попробовать такой код:

    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{QUERY_STRING} ([^=]+)=(.+)
    RewriteRule .* /%1/%2? [R=301,L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    P.S. Если в get параметре будут присутствовать кирилические символы, то после редиректа в строке браузера они будут отображаться закодированными (т.е. вот так: %D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0)

    earlnik 8 лет назад

    редирект происходит, но отключаются все стили

    Zero 8 лет назад

    Хм, понятно. Это потому, что к стилям и скриптам тоже приписываются get параметры. Тогда используйте следующий код:

    RewriteCond %{QUERY_STRING} ([^=]+)=(.+)
    RewriteRule ^$ /%1/%2? [R=301,L]
    earlnik 8 лет назад

    Благодарю, все работает как надо

    earlnik 8 лет назад

    Поторопился... не все работает как надо

    данный редирект работает для товаров, но он сломал редиректы для таких ссылок

    без такого правила работало так:

    https://banzai-sport.com/?page_id=5354 редиректит на такую ссылку https://banzai-sport.com/utyazheliteli-so-skidkoj/

    https://banzai-sport.com/?attachment_id=5006 редиректит на эту ссылку https://banzai-sport.com/product/manzhety-dlya-nog-05-kg/manzhety-dlya-nog-0-5-kg/

    а с этим правилом стало так

    https://banzai-sport.com/?page_id=5354 редиректит на такую ссылку https://banzai-sport.com/page_id/5354

    https://banzai-sport.com/?attachment_id=5006 редиректит на эту ссылку https://banzai-sport.com/attachment_id/5006

    соответственно ошибка 404

    еще и куки в браузере запоминает и только полной чисткой можно после удаления правила опять в браузере увидеть то что было раньше

    Zero 8 лет назад

    Да, браузеры помнят о 301 редиректе, пока хранится кэш. Ну что ж, ситуация ясна. Тогда добавим еще одну проверку на наличие упоминания _id в get запросе. Если он будет присутствовать, то редирект игнорируется.

    RewriteCond %{QUERY_STRING} !^[a-z]+_id= [NC]
    RewriteCond %{QUERY_STRING} ([^=]+)=(.+)
    RewriteRule ^$ /%1/%2? [R=301,L]
    earlnik 8 лет назад

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

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

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

    Zero 8 лет назад

    Если взять адрес https://banzai-sport.com/?product=zhilet-utyazhelitel-kompakt-2-20-kg-razmer-44-48, то в переменную веб-сервера QUERY_STRING попадет только product=zhilet-utyazhelitel-kompakt-2-20-kg-razmer-44-48, без всяких слешей и вопросительных знаков вначале. Получается, что если вы хотите делать редирект только к одной этой категории product, вам достаточно будет этого:

    RewriteCond %{QUERY_STRING} ^product=(.+)
    RewriteRule ^$ /product/%1? [R=301,L]
    earlnik 8 лет назад

    product - это не категория, это вукомерсс подставляет в ссылку для товаров, если ссылка динамическая, она выглядит так /?product=naimenovanie-tovara , а для постоянной ссылки она формируется вот так - /product/naimenovanie-tovara/

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

    видна я слишком много понаписал и ввел несколько в заблуждение вас...

    В любом случае благодарю за помощь, натолкнули на мысль в каком направлении копать...

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация