301 редирект для категорий с подкатегориями

Тема в разделе "Mod Rewrite / htaccess / ЧПУ", создана пользователем Freeman Liberty, 18 июн 2014.

  1. Freeman Liberty

    Freeman Liberty

    Регистр.:
    19 май 2009
    Сообщения:
    457
    Симпатии:
    171
    Помогите правильно прописать редирект
    На сайте была категория "Бытовая техника" сайт.ru/household-appliances
    содержащая подкатегории "Крупная бытовая техника" сайт.ru/household-appliances/major-appliances/
    и "Встраиваемая техника" сайт.ru/household-appliances/vstraivaemaya-tehnika/

    Данные категории в свою очередь включали в себя ряд подкатегорий

    например, категория "Крупная бытовая техника" включала подкатегорию "Холодильники"
    сайт.ru/household-appliances/major-appliances/fridge/

    Название категории "Бытовая техника" household-appliances изменилось на bytovaia-tehnika
    Название категории "Крупная бытовая техника" major-appliances изменилось на krupnaia
    Название категории "Холодильники" fridge изменилось на holodilniki

    т.е. раньше урл был
    сайт.ru/household-appliances/major-appliances/fridge/
    теперь стал
    сайт.ru/bytovaia-tehnika/krupnaia/holodilniki/

    Как правильно настроить редирект для категорий и подкатегорий, учитывая, что в них, также имеется постраничная навигация такого вида?
    сайт.ru/bytovaia-tehnika/krupnaia/holodilniki/?page=3
     
    Последнее редактирование: 18 июн 2014
  2. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    321
    Симпатии:
    117
    Делал перенос одного интернет-магазина, пришлось делать ручные 301 редиректы со старых подподкатегорий на новые, со старых подкатегорий на новые, со старых категорий на новые... Файл htaccess вырос до 400 строк, но сайт функионировал так как нужно, и весь трафик сохранился... Другими словами при ТАКИХ кардинальных изменениях урлов - автоматизация крайне сложна, нужно делать руцями...

    Относительно постраничной навигации, то при отлове урлов по REQUEST_URI все параметры остаются на месте и добавляются к новой странице, на которую сделан редирект...
     
  3. Freeman Liberty

    Freeman Liberty

    Регистр.:
    19 май 2009
    Сообщения:
    457
    Симпатии:
    171
    Предположим для основной категории можно прописать редирект так
    RewriteRule ^household-appliances/(.*) /bytovaia-tehnika/ [R=301,L]

    А как для подкатегорий household-appliances/major-appliances и household-appliances/major-appliances/fridge ?
     
  4. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    321
    Симпатии:
    117
    Так не получится. У Вас от старых адресов ничего не осталось, все составляющие урла заменены. Поэтому нужно полностью со старого адреса делать переадресацию на новый.
    Так:
    Код:
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{REQUEST_URI} household-appliances/major-appliances/fridge
    RewriteRule household-appliances/major-appliances/fridge /bytovaia-tehnika/krupnaia/holodilniki/ [R=301,L]
    
    Или так:
    Код:
    RewriteEngine On
    RewriteBase /
    
    RedirectPermanent /household-appliances/major-appliances/fridge/ /bytovaia-tehnika/krupnaia/holodilniki/
    
    Единственное как можно автоматизировать - это сделать замену пар "старая часть урла" -> "новая часть урла" и каждую часть урла подменять отдельно, но это приведет к нескольким редиректам при загрузке одной страницы, что в свою очередь приведет к дополнительным нагрузкам на сервер при большой посещаемости сайта (да и гемороя и строчек кода здесь будет на порядок больше)
    Пример вышесказанного:
    Код:
    RewriteEngine On
    RewriteBase /
    
    #пара измененных адресов всё-что-угодно/всё-что-угодно/fridge->всё-что-угодно/всё-что-угодно/holodilniki
    RewriteCond %{REQUEST_URI} [a-zA-Z-]+/[a-zA-Z-]+/fridge
    RewriteRule ([a-zA-Z-]+/[a-zA-Z-]+)/fridge /$1/holodilniki [R=301,L]
    ##и так далее перечисление всех нижних категорий старая->новая
    
    #пара измененных адресов всё-что-угодно/major-appliances/всё-что-угодно->всё-что-угодно/bytovaia-tehnika/всё-что-угодно
    RewriteCond %{REQUEST_URI} [a-zA-Z-]+/major-appliances/[a-zA-Z-]+
    RewriteRule ([a-zA-Z-]+)/major-appliances/([a-zA-Z-]+) /$1/krupnaia/$2 [R=301,L]
    ##и так далее перечисление всех средних категорий старая->новая
    
    #пара измененных адресов household-appliances/всё-что-угодно/всё-что-угодно->bytovaia-tehnika/всё-что-угодно/всё-что-угодно
    RewriteCond %{REQUEST_URI} household-appliances/.*
    RewriteRule household-appliances/(.*) /bytovaia-tehnika/$1 [R=301,L]
    ##и так далее перечисление всех верхних категорий старая->новая
    
    Но если честно, то перечислить все изменившиеся категории и послать их на новые без "автоматизаций" будет гораздо лучше и для сервера и для программера ;)

    PS: у Вас реально на сайте 25 категорий + подкатегорий. Это около 50 строчек кода и вопрос решен... Когда я переносил магазин у меня ушло 409 строчек кода, а у Вас лёгкий случай.
    PPS: кстати у Вас под СЕО тексты не предусмотрено места, Вы бы при создании позаботились об этом, а то потом дорабатывать...
     
    Последнее редактирование: 18 июн 2014
    Freeman Liberty нравится это.
  5. Freeman Liberty

    Freeman Liberty

    Регистр.:
    19 май 2009
    Сообщения:
    457
    Симпатии:
    171
    Я тоже думаю, что больше двух редиректов для страницы это уже перебор.
    Сделал сейчас так
    Код:
    RewriteRule ^household-appliances/major-appliances/fridge/(.*)$ bytovaia-tehnika/krupnaia/holodilniki/$1 [R=301,L]
    RewriteRule ^household-appliances/major-appliances/(.*)$ bytovaia-tehnika/krupnaia/$1 [R=301,L]
    RewriteRule ^household-appliances/(.*)$ bytovaia-tehnika/$1 [R=301,L]
    Результат устраивает или переведенная вами конструкция
    чем то лучше?

    Под сео тексты место есть - в самом начале каждой категории. Просто не для всех категорий они написаны
    Посмотрите, например, bytovaia-tehnika/krupnaia/holodilniki/
    P.S. И вообще я название домена убирал не для того, чтобы вы вычисляли сайт через Яшу :)
     
    Последнее редактирование: 18 июн 2014
  6. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    321
    Симпатии:
    117
    Она лучше тем, что не будет ошибочных переадрессаций... Проверка есть проверка...
    дабы недопустить ошибочных переадресаций при просто RewriteRule нужно сначала перечислить все правила нижних категорий, затем за ними все правила средних категорий, и только потом все правила верхних категорий.
    Пример:
    Код:
    #сначала все нижние
    RewriteRule ^household-appliances/major-appliances/fridge/(.*)$ bytovaia-tehnika/krupnaia/holodilniki/$1 [R=301,L]
    RewriteRule ^household-appliances/major-appliances/oldsubsubcat1/(.*)$ bytovaia-tehnika/krupnaia/newsubsubcat1/$1 [R=301,L]
    RewriteRule ^household-appliances/major-appliances/oldsubsubcat2/(.*)$ bytovaia-tehnika/krupnaia/newsubsubcat2/$1 [R=301,L]
    
    #затем все средние
    RewriteRule ^household-appliances/major-appliances/(.*)$ bytovaia-tehnika/krupnaia/$1 [R=301,L]
    RewriteRule ^household-appliances/oldsubcat1/(.*)$ bytovaia-tehnika/newsubcat1/$1 [R=301,L]
    RewriteRule ^household-appliances/oldsubcat2/(.*)$ bytovaia-tehnika/newsubcat2/$1 [R=301,L]
    
    #затем все верхние
    RewriteRule ^household-appliances/(.*)$ bytovaia-tehnika/$1 [R=301,L]
    RewriteRule ^oldcat1/(.*)$ newcat1/$1 [R=301,L]
    RewriteRule ^oldcat2/(.*)$ newcat2/$1 [R=301,L]
    
    да, действительно есть. Правда если текст будет 3000 символов - часть придется каким-то образом прятать...
    Я и не вычислял. Посмотрите свой первый пост, 3 строчка - вы не удалили название интернет магазина после слов "сайт.ru/" ;)
     
    Freeman Liberty нравится это.