WordPress как на ладони
WordPress темы и плагины за 250 рублей wordpress jino

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

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

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

Общие настройки
Произвольно: /%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
год назад
  • 0

    Если применительно конкретно к вашему сайту 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 год назад

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

    Zero год назад

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

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

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

    earlnik год назад

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

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

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

    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 год назад

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

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

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

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

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

    Zero год назад

    Если взять адрес 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 год назад

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

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

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

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

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