301 редирект в файле .htaccess

Перенаправляет все содержимое каталогов https:// site.ru/dir1/group1/group2/ → в  https:// site.ru/dir2/group1/group2/ 

RewriteCond %{REQUEST_URI} ^/dir1/(.*)$ 
# если строка начинается с /dir1/ 
RewriteRule ^(.*)$ /dir1%1 [R=301,L]

RewriteRule ^reviews/nashi-dovolnye-klienty/.+$ /reviews/nashi-dovolnye-klienty/ [L,R=301,NC]
RewriteRule ^reviews/video-otzyvy/.+$ /reviews/video-otzyvy/ [L,R=301,NC]
RewriteRule ^reviews/o-nas-pishut/.+$ /reviews/o-nas-pishut/ [L,R=301,NC]
RewriteRule ^promotions/.+$ /promotions/ [L,R=301,NC]
Перенаправить все урлы с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL.
Вариант:
RewriteCond %{REQUEST_URI} ^(.*)/ru/products/receivers/(.*)$ 
RewriteRule ^(.*)$ %1/ru/products/vintovye-kompressory-dalgakiran/receivers/%2 [R=301,L] 

Перенаправляет все содержимое каталогов /catalog/dir1/group1/group2/ → в /catalog/dir2/group1/group2/
RewriteCond %{REQUEST_URI} ^(.*)/dir1/(.*)$ 
# если строка содержит /dir1/ 
RewriteRule ^(.*)$ %1/dir2/%2 [R=301,L]

Перенаправить все урлы с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL


Дополнительная информация.

Синтаксис .htaccess. Полное руководство

301 редиректы в .htaccess. Список шаблонов

htaccess — это конфигурационный файл веб-сервера Apache, позволяющий управлять работой веб-сервера и настройками сайта с помощью различных параметров (директив) без изменения основного конфигурационного файла веб-сервера.

Важная информация!

  1. После настройки глобальных правил редиректов (любые перенаправления, кроме редиректа со страницы на страницу) ставьте задачу на разработчика по проверке форм и корзины. Так как часто ломаются формы и клиент не получает заказы

  2. Не правьте файл .htaccess через административную панель сайта (админку), так как если сайт ляжет, то вы не сможете ничего править

Правила по настройке файла

Правило №1. Написанное ниже нужно вставить в самое начало .htaccess

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

Правило №2. В начале мелкие редиректы, потом глобальные

В начале файла .htaccess всегда идут постраничные редиректы (редирект с страницы на страницу), потом с раздела на раздел, а уже после глобальные правила (такие как с http на https, с www на без www и прочее).

Правило №3. Если что-то написано в #, то оно не учитывается

Если вы в начале любого правила напишите #, то такой редирект не сработает, так как он просто не будет учитываться. С помощью # пишите комментарии, чтобы другой SEO-специалист понял что за редирект вы сделали

Правило №4. Создайте копию на компьютере перед редактированием

Убедитесь в том, что вы сохранили у себя на ПК резервную копию оригинального файла .htaccess, прежде чем вносить какие-либо изменения, чтобы можно было вернуть обратно.

Правило №5. Просто посмотрите на примере

Чтобы стало понятно что мы тут понаписали, проще увидеть пример и мы подготовили его для вас с подробным описанием.

Редирект с 1 страницы сайта на другую

#Обычный редирект с страницы сайта на другую
Redirect 301 /old-stranitsa https://site.ru/new-stranitsa
#Редирект с 1 страницы на другую на
MODX RewriteRule ^old-page/$ new-page/ [R=301,NC,L]
#Редирект с 1 страницы сайта на другую в OpenCart
RewriteCond %{QUERY_STRING} ^_route_=old-page/old-page/$ RewriteRule ^(.*)$ https://my-site.com/new-page/new-page/? [R=301,L]
#Редирект с 1 страницы на другую для URL и домена на кириллице на URL на латинице
Redirect 301 /ru/product/старая-страница/ https://xn--b1aghu1a.xn--p1acf/ru/product/novaya-stranicza/

Редиректы, если в URL есть пробел

Чтобы в .htaccess работал редирект с пробелами ссылку нужно заключать в кавычки (без спецсимволов), т.е:

#Для WordPress и прочих CMS
Redirect 301 "/old page" "https://site.ru/new-stranitsa" #Для сайтов на MODX
RewriteRule "^/?old-page/montazh cherepiczy instrukc$" "https://site.ru/new-page/" [R=301,L]

Редиректы с домена на домен

#Редирект с главной страницы на другой домен
RewriteEngine On RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ https://site.ru/ [L,R=301] #Редирект с домена на домен
RewriteEngine On RewriteCond %{HTTP_HOST} old-site.ru
RewriteRule (.*) https://new-site.ru/$1 [R=301,L]

Редиректы для URL с GET-параметрами

#Редирект делает редиректы с страниц типа: ?product_id=858
RewriteCond %{QUERY_STRING} (?:^|&)^product_id\=858(?:$|&)
RewriteRule ^index\.php$ /catalog/new_page? [L,R=301] #Редирект с GET-параметрами
RewriteCond %{QUERY_STRING} (^|&)product_cat\=uncategorized($|&)
RewriteRule ^$ /katalog #Настройка редиректа с GET-параметром c страницы на страницу #url до параметра
RewriteCond %{REQUEST_URI} ^/component/virtuemart/$ #то, что после параметра (вместо ?= ставится ^)
RewriteCond %{QUERY_STRING} ^page=shop.browse&category_id=12 #новый url RewriteRule ^.*$ /arenda-gruzovogo-avto.html? [R=301,L]

Редирект страниц на https-версию

#Вариант №1
RewriteEngine On RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] #Вариант №2
RewriteEngine On RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Если не сработало, попробуйте варианты, которые указаны ниже

RewriteEngine On
RewriteCond% {HTTPS} off
RewriteRule (. *) Https: //% {HTTP_HOST}% {REQUEST_URI} [R = 301, L] RewriteEngine On
RewriteCond %{HTTPS} =off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L] RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

Редирект для слешей (/)

Убираем повторяющиеся слеши (/) в URL

RewriteCond %{THE_REQUEST} //
RewriteCond %{QUERY_STRING} !http(s|)://
RewriteRule .* /$0 [R=301,L]

Редирект с множественных слешей (/////) и http на 1 слеш (/) и https

RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]

Редирект с множественных слешей (/////) и на без слеша (/)

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^(.+)/$ /$1 [R=301,L]

Автоматическая подстановка слеша (/) в конце адреса.

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

RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

Добавляем слеш(/), если его нет, и это не файл.

*Не добавляйте на сайты на Elementor (WordPress)

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} ^(.+)$
RewriteRule ^(.*)$ $1/ [L,R=301]

Переадресация с www на без www и наоборот

Перенаправление домена с www на без www

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

Редирект без www на версию с www

RewriteCond %{HTTP_HOST} ^site\.ru$ [NC]
RewriteRule ^(.*)$ https://www.site.ru/$1 [R=301,L]

Перенаправление домена с www на без www, если домен на русском

RewriteEngine On RewriteCond %{HTTP_HOST} ^www.xn--80adaxca8c.xn--p1ai$ [NC]
RewriteRule ^(.*)$ https://xn--80adaxca8c.xn--p1ai/$1 [R=301,L]

Перенаправление всего домена одновременно с версии с www на версию без www и с HTTP на HTTPS

При использовании данного правила не используйте отдельные правила редиректов с http на https и www. В редких случаях из-за такого могут вовсе не работать все редиректы.

RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Прочие массовые редиректы

С одной категории сайта на другую

RewriteCond %{REQUEST_URI} ^(.*)/old-stratitha/(.*)$
RewriteRule ^(.*)$ %1/new-stratitha/%2 [R=301,L]

Убираем html на конце URL

RewriteEngine on
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP
RewriteRule ^([^.]+)\.html$ $1 [R=301,L]
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule (.*) /$1.html

Убираем index.php на конце URL

#Настройка редиректа с index.php на конце
RewriteEngine On RewriteCond %{REQUEST_URI} ^/(.*?)/index\.php$
RewriteRule ^ /%1/ [R=301,L]

Не забываем заменять https://site.ru/ на адрес своего сайта, иначе редиректы не сработают!

#Вариант №2
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ https://site.ru/ [R=301,L] 

#Вариант №3
RewriteCond %{REQUEST_URI} /index.php
RewriteRule ^(.*)$ https://site.ru/ [R=301,L]

Массовый редирект одновременно с index.php и index.html

#Вариант №1
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTPS/
RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,L] 

#Вариант №2
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/
RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,L]

 #Вариант №3
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
RewriteRule ^(.*)index\.php$ https://%{HTTP_HOST}/$1 [R=301,L] 

#Вариант №4
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(htm)\ HTTP/
RewriteRule ^(.*)index\.(htm)$ $1 [R=301,L]

Перенаправление в случае обновления веб-ресурса

*Вместо 14.124.354.80 - заменить на свой IP адресс.

RewriteEngine on
RewriteCond %{REQUEST_URI} !/info.html$
RewriteCond %{REMOTE_HOST} !^14\.124\.354\.80
RewriteRule $ http://vash-sait.ru/info.html [R=302,L]

Защита от хотлинков (кражи контента)

#Вариант №1
RewriteEngine On RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://([ -a-z0-9] \.)?vash-sait\.ru [NC]
RewriteRule \.(gif|jpe?g|png)$ - [F,NC,L] 

#Вариант №2
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?ваш-домен.ru/.*$ [NC]
RewriteRule .*.(gif|jpg|png|ico)$ - [F,L]

Настройка перенаправлений на страницы ошибок (4xx, 5xx)

Пользовательская страница ошибок(404)

*Вместо указанных страниц с .html указываем адрес страницы ошибки на сайте

<>ErrorDocument 404 "/404.html"

Другие варианты страниц ошибок

ErrorDocument 401 /errors401.html ErrorDocument 403 /errors403.html ErrorDocument 404 /errors404.html ErrorDocument 500 /errors505.html

Правило для удаления лишних цифр на конце URL

RewriteEngine On RewriteRule ^(.+?)/\d+/?$ /$1/ [R=301,L]

Редиректы с верхнего регистра в нижний

Редирект с верхнего регистра в нижний ТОЛЬКО ДЛЯ URL (картинки он не трогает)

*может сделать редирект с внутренних страниц на главную, поэтому проверяйте внимательно

RewriteCond %{REQUEST_URI} ^[^A-Z]*[A-Z].*
RewriteCond %{REQUEST_URI} !(.*)\.jpg$
RewriteRule ^ https://%{HTTP_HOST}${lc:%{REQUEST_URI}} [L,R=301]

Редирект с URL в верхнем регистре на URL с нижним регистром

*Не всегда работает правильно и может создать цепочку редиректов. Если это произойдет прибегните к примеру №2

#Пример №1
RewriteCond expr "tolower(%{REQUEST_URI}) =~ /(.+)/"
RewriteRule [A-Z] %1 [R=301,L]

Пример №2

Напишите в поддержку хостинга сообщение, которое указано ниже

Доброго дня! Для сайта - https://ваш-сайт.ru/

Необходимо настроить редирект для URL-адресов с верхнего регистра в нижний. Для корректного редиректа нужно изменить файл http.conf. У нас к нему доступа нет, но он есть у вас. Нужно добавить в http.conf

RewriteMap lc int:tolower

После чего добавить в .htaccess правило

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^[^A-Z]*[A-Z].*
RewriteRule ^ https://%{HTTP_HOST}${lc:%{REQUEST_URI}} [L,R=301]

Закрываем сайт от индексации

Способ ниже закрывает сайт отдельно для каждой поисковой системы. При парсинге с помощью утилит парсит 1 страницу и выдает 404 ошибку.

Способ №1 - закрывает от всех поисковых ботов

SetEnvIfNoCase User-Agent «^Googlebot» search_bot
SetEnvIfNoCase User-Agent «^Yandex» search_bot
SetEnvIfNoCase User-Agent «^Yahoo» search_bot
SetEnvIfNoCase User-Agent «^Aport» search_bot
SetEnvIfNoCase User-Agent «^msnbot» search_bot
SetEnvIfNoCase User-Agent «^spider» search_bot
SetEnvIfNoCase User-Agent «^Robot» search_bot
SetEnvIfNoCase User-Agent «^php» search_bot
SetEnvIfNoCase User-Agent «^Mail» search_bot
SetEnvIfNoCase User-Agent «^bot» search_bot
SetEnvIfNoCase User-Agent «^igdeSpyder» search_bot
SetEnvIfNoCase User-Agent «^Snapbot» search_bot
SetEnvIfNoCase User-Agent «^WordPress» search_bot
SetEnvIfNoCase User-Agent «^BlogPulseLive» search_bot
SetEnvIfNoCase User-Agent «^Parser» search_bot

Закрывает сайт для робота Яндекс

SetEnvIfNoCase User-Agent .*yandex.* search_robot
SetEnvIfNoCase User-Agent .*mail.* search_robot
Deny from env=search_robot

Варианты ошибок в htaccess и решения

Проблема

На OpenCart при настройке массовых правил происходит редирект на URL с index.php?_route_= и только потом на рабочий URL

Решение

В htaccess неправильно настроены порядок редиректов. Нельзя размещать директивы и правила после

RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

Перенесите все правила, которые стоят ниже вышеуказанного правила, на самый верх файла.


Дополнительная информация.

Синтаксис .htaccess. Полное руководство