WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

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

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

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

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

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

    Zero 6.9 лет назад

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

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

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

    earlnik 6.9 лет назад

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

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

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

    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 6.9 лет назад

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

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

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

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

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

    Zero 6.9 лет назад

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

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

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

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

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

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