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.