WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

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

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

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

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

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

    Zero 1.5 год назад

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

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

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

    earlnik 1.5 год назад

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

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

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

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

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

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

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

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

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

    Zero 1.5 год назад

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

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

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

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

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

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