@miron-partner

Wordpress | Как прописать 301 редирект после смены формата ЧПУ?

Здравствуйте. Сайт имел много рубрик и следующий формат ссылок (ЧПУ):

site.ru/category1-post1.html
site.ru/category2-post23.html
site.ru/category3-post17.html
site.ru/category4-post9.html

То есть вместо разделителя каталога использовался не традиционный "/", а дефис "-")
Сейчас хочу привести все в нормальный вид - сменить ЧПУ а также объединить несколько категорий в одну. Чтоб в итоге было так:

site.ru/category5/post1.html
site.ru/category5/post23.html
site.ru/category5/post17.html
site.ru/category5/post9.html

Для сохранения ссылочного и позиций всех страниц сайта нужно настроить 301 редирект. Нужна помощь знающих людей. Помогите составить записи в файле .htaccess согласно вышеприведенных примеров (если знаете). Вот мой вариант:

RewriteRule ^(.*)/category1-(.*)$ $1/category5/$2 [R=301,L]
RewriteRule ^(.*)/category2-(.*)$ $1/category5/$2 [R=301,L]
RewriteRule ^(.*)/category3-(.*)$ $1/category5/$2 [R=301,L]
RewriteRule ^(.*)/category4-(.*)$ $1/category5/$2 [R=301,L]

Правильно?
  • Вопрос задан
  • 294 просмотра
Решения вопроса 1
@miron-partner Автор вопроса
RewriteRule ^category[0-4]-(.+\.html)$  https://site.ru/category5/$2 [R=301,L]


Этот код НЕ РАБОТАЛ так как был не верно указан номер подвыражения из левой части, который использовался в правой - вместо "$2" нужно было написать $1.

Правильный вариант следующий:

RewriteRule ^category[0-4]-(.+\.html)$  https://site.ru/category5/$1 [R=301,L]


  • Левая сторона - это шаблон ссылки который получает сервер (^category[0-4]-(.+\.html)$);
  • Правая сторона - ссылка в которую превращается входящий шаблон, на которую осуществляется редирект (https://site.ru/category5/$2).
$(номер) - это подвыражения из левой части, то что заключалось у вас в скобки. А номер означает порядковый номер (от общего их количества по порядку с лева на право начиная с нулевой). Открывая скобки в левой части, мы таким образом создаем подвыражение и помещаем его в переменную $n, где n это его порядковый номер. Если таких подвыражений в левой части было 3, то переменные с ними будут следующие: $1, $2 и $3. То есть если нам нужно в правой части использовать какой либо кусок строки (ссылки) из левой части (в том виде в котором она была), которую мы взяли там в скобки, то мы можем вывести это с помощью $1, $2 или $3 (в зависимости от того сколько скобок у Вас в левой части было).

Рассмотрим левую часть нашего правила:
(.+\.html) - регулярное выражение в скобках означает что данная часть строки (ссылки) может иметь любую длину из любых символов, но обязательно закончится на ".html".
  • "." - любой знак(символ);
  • "+" - количество этих любых знаков (".") повторяется от 1 до 65536 раз
  • "\" - экранирующий знак, который превращает спец символ (".") в обыкновенный символ (в данном случае в точку)
  • "html" - это просто текст.
  • "$" - означает конец строки.


Если мы хотим использовать единственное подвыражение взятое из левой части (.+\.html) то для вставки ее в правой части мы уже будем использовать просто $1. А если бы в левой части было 2 пары скобок (2 подвыражения), то в правой части мы вызывали бы их с помощью $1 и $2.


Ну а теперь что касается моего конкретного случая:

Мне нужно было массово попереносить посты из одной категории в другую. Мало того у меня ЧПУ (чловекподобный урл) были настроены так что категория в ссылке выделялась не как обычно слешами с двух сторон (/category/), а дефисом справа (/category-). И мне нужно было поменять ЧПУ на нормальный, попереносить посты в другие категории и настроить при этом 301 редиректы со старых урл на новый, чтоб сохранить ссылочное и возраст.

http:/site.ru/znaki_zodiaka-muzhchina-rak-v-sekse.html
http:/site.ru/znaki_zodiaka-muzhchina-ryby-v-sekse.html
http:/site.ru/znaki_zodiaka-zhenshhina-lev-v-sekse.html
http:/site.ru/znaki_zodiaka-zhenshhina-rak-v-sekse.html
http:/site.ru/znaki_zodiaka-muzhchina-oven-v-sekse.html
http:/site.ru/znaki_zodiaka-muzhchina-vesy-v-sekse.html
http:/site.ru/znaki_zodiaka-muzhchina-skorpion-v-sekse.html
http:/site.ru/znaki_zodiaka-zhenshhina-oven-v-sekse.html
http:/site.ru/znaki_zodiaka-muzhchina-bliznecy-v-sekse.html
http:/site.ru/znaki_zodiaka-muzhchina-kozerog-v-sekse.html
http:/site.ru/znaki_zodiaka-zhenshhina-kozerog-v-sekse.html
http:/site.ru/znaki_zodiaka-muzhchina-lev-v-sekse.html
http:/site.ru/znaki_zodiaka-muzhchina-strelec-v-sekse.html
http:/site.ru/znaki_zodiaka-zhenshhina-telec-v-sekse.html
http:/site.ru/znaki_zodiaka-zhenshhina-ryby-v-sekse.html
http:/site.ru/znaki_zodiaka-zhenshhina-vodolej-v-sekse.html
http:/site.ru/znaki_zodiaka-muzhchina-vodolej-v-sekse.html


Была категория "Знаки зодиака" (/znaki_zodiaka-). Посты из нее нужно было перенести в категорию "Блог" с уже нормальным ЧПУ (/blog/). Вот благодаря какой записи у меня заработал 301 редирект:

Вариант 1:

RewriteEngine On
RewriteBase /
RewriteRule ^znaki_zodiaka-(.+\.html)$ /blog/$1 [R=301,L]


Но у меня было много категорий посты из которых мне нужно было снести в "Блог"(/blog/). Вот как я записал и все заработало:

Вариант 2:

RewriteEngine On
RewriteBase /
RewriteRule ^(muzhchiny|masturbacia|orgazm|oralniy_seks|devushki|seks_v_internete|sluchayniy_seks|seks_igrushki|raznoe|aksessuary|zhizn_bez_seksa|porno_industriya|kontracepcia|libido|recepty|texnika_seksa|exercise|erekcia|eakuliacia|yumor_i_prikoly|otnoshenija|znaki_zodiaka)-(.+\.html)$ blog/$2 [R=301,L]


Обратите внимание, что для того чтоб не писать каждый раз новое отдельное правило для всех категорий, посты которых я хотел перенести (а таких категорий около 20 шт ), я всего лишь в одном правиле открыв скобки (создав подвыражение) перечислил их через "|". И в результате этого у меня в левой части моего правила стало уже 2 подвыражения, в следствии чего второе подвыражение в правой части уже вызывалось с помощью $2 (а не $1 как было в варианте 1 ). Пару часов продолбался пока осенило почему у меня Вариант 2 не хотел работать))) Вот толковая статья, которая помогла мне разобраться: max22.ru/server/htaccess

Кстати!!! Первые две строчки обязательны.
  • "RewriteEngine On" - включает возможность обработки редиректа в файле .htaccess
  • "RewriteBase /" - говорит чтоб все url считались не от корневого каталога сервера, а локально - от той папки в которой лежит сайт.

Значение записей после первых 2-х строчек
  • "^" - начало ссылки после site.ru
  • "(категория 1|категория 2|категория 3....)-(.+\.html)" - первое подвыражение с перебором рубрик потом "-" и второе подвыражение с остальной частью ссылки.
  • " blog/$2" - после левой части ставим пробел и пишем то на что нужно заменить слаг категории (на blog/) и остальную часть ссылки которая должна остаться неизменной мы вставляем с помощью переменной ($2, которая равна 2-му подвыражению в левой части)
  • " [R=301,L]" - Редирект 301 и это окончательный постоянный адрес
Важно!!!
Код редиректа я вставлял почти в самом верху файла до каких либо еще записей с другими редиректами (у меня Wordpress). В конце файла эти правила не хотели работать. Я читал, что правила обрабатываются в том порядке в котором они пишутся в .htaccess. Возможно, что другие правила (которые стояли выше) как-то перебивали мои новые. Я вставил свои в начало и все заработало.

Спасибо за участие в решении моей задачи Виктору Тарану Виктор Таран и dodo512 dodo512.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
shambler81
@shambler81 Куратор тега htaccess
RewriteRule ^category[0-4]-(.+\.html)$  https://site.ru/category5/$2 [R=301,L]

Можно и одним правилом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы