301 редирект в htaccess
Что это и зачем нужно
301 (Permanent Redirect) — постоянная переадресация пользователя и поискового робота с одного URL на другой. В отличие от 302 (временного), 301 передаёт накопленный ссылочный вес и позиции на новый адрес. Поисковик понимает: старая страница больше не существует, вся ценность переходит на новую.
Когда применять 301
- Смена домена целиком (old-site.ru → new-site.ru)
- Переход с HTTP на HTTPS
- Склейка зеркал (site.ru и www.site.ru — для поисковика это разные сайты)
- Изменение URL страниц (например, при смене CMS или переработке структуры)
- Удаление страниц — чтобы пользователи не видели 404
- Перенос раздела на субдомен
- Аккумуляция трафика с нескольких доменных зон на один основной
Когда НЕ применять: при временном переносе, при проблемах со старым доменом (бан, фильтр) — 301 перенесёт и проблемы тоже.
Способ 1 — .htaccess (Apache) — основной и рекомендуемый
Файл .htaccess находится в корневой папке сайта (public_html). Если его нет — создайте. Все правила оборачиваются в блок IfModule и начинаются с RewriteEngine On.
<IfModule mod_rewrite.c>
RewriteEngine On
# ... ваши правила ...
</IfModule>
Всегда используйте флаг [R=301,L] — без него хостинг может поставить 302 по умолчанию.
Склейка зеркал: www → без www
RewriteCond %{HTTP_HOST} ^www\.name\.site$ [NC]
RewriteRule ^(.*)$ http://name.site/$1 [R=301,L]
Склейка зеркал: без www → www
RewriteCond %{HTTP_HOST} ^name\.site$ [NC]
RewriteRule ^(.*)$ http://www.name.site/$1 [R=301,L]
HTTP → HTTPS (весь сайт)
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Если не сработало — расширенный вариант:
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
HTTPS → HTTP (если нужен обратный переход)
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTP} =on
RewriteRule ^(.*)$ http://name.site/$1 [R=301,L]
Смена домена (с сохранением структуры URL)
RewriteCond %{HTTP_HOST} ^www\.old-site\.ru$ [NC]
RewriteRule ^(.*)$ http://new-site.ru/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^old-site\.ru$ [NC]
RewriteRule ^(.*)$ http://new-site.ru/$1 [L,R=301]
Редирект одной страницы на другую (без параметров)
RewriteRule ^(.*)old-page\.html$ http://your-site.ru/new-page.html [R=301,L]
Редирект страницы с параметрами в URL
RewriteCond %{QUERY_STRING} section=1
RewriteRule ^index.php http://name.site/articles.php? [R=301,L]
Редирект с index.php на главную
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://name.site/ [R=301,L]
Убрать слеш в конце URL (для всего сайта)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^(.+)/$ /$1 [R=301,L]
Добавить слеш в конце URL (обратное)
RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]
Редирект 404 → главная (или другая страница)
ErrorDocument 404 http://www.site.com/index.html
Осторожно: массовые 301 с 404 могут негативно повлиять на SEO-статистику. Лучше направлять на тематически близкие страницы, а не всё на главную.
Пример финального .htaccess
Options -Indexes
ErrorDocument 404 /404.php
<IfModule mod_rewrite.c>
RewriteEngine On
# Склейка www → без www
RewriteCond %{HTTP_HOST} ^www\.my-site\.ru$ [NC]
RewriteRule ^(.*)$ https://my-site.ru/$1 [R=301,L]
# HTTP → HTTPS
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Убрать слеш в конце
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^(.+)/$ /$1 [R=301,L]
</IfModule>
Способ 2 — PHP
Вставляется в начало нужного файла (например, index.php) — до любого вывода в браузер:
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.new-site.ru/new-page/");
exit();
?>
Или условно для конкретного URL:
if ($_SERVER['REQUEST_URI'] == "/old-page.php") {
header("Location: /new-page/", TRUE, 301);
exit();
}
Способ 3 — Nginx
Добавляется в конфигурационный файл виртуального хоста:
if ($host = 'www.domain.com') {
rewrite ^(.*)$ http://domain.com$1 permanent;
}
Для перехода с HTTP на HTTPS:
server {
listen 80;
server_name domain.com www.domain.com;
return 301 https://domain.com$request_uri;
}
Способ 4 — CMS и плагины
WordPress — плагины: Redirection (лучший вариант, есть статистика и поддержка regex), Safe Redirect Manager, Simple 301 Redirects.
OpenCart — через .htaccess:
RewriteCond %{QUERY_STRING} ^_route_=old-page.html$
RewriteRule ^(.*)$ http://your-site.ru/new-page/? [R=301,L]
Joomla — через панель администратора: Компоненты → Перенаправление.
Bitrix — через .htaccess, пример склейки:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.your-site\.ru$ [NC]
RewriteRule ^(.*)$ http://your-site.ru/$1 [R=301,L]
Wix, Тильда — встроенные редакторы редиректов в личном кабинете (файл .htaccess недоступен).
Способ 5 — Панели управления сервером
cPanel: Домены → Перенаправления → тип «Постоянный 301» → указать старый и новый адрес.
ISPmanager: раздел «WWW-домены» → настройки домена → галочки HTTPS/www.
Таблица регулярных выражений для .htaccess
| Символ | Значение |
|---|---|
. |
любой одиночный символ |
.* |
любой набор символов (в т.ч. пустой) |
^ |
начало строки |
$ |
конец строки |
[abc] |
один из перечисленных символов |
[^abc] |
любой символ кроме перечисленных |
* |
предыдущий символ 0 или более раз |
[0-9] |
любая цифра |
[a-z] |
любая буква в нижнем регистре |
\d |
любая цифра |
\w |
буква, цифра или _ |
Проверка редиректа
Ручная: вставить старый URL в браузер — должна открыться новая страница.
Инструменты:
- redirect-checker.org — проверка цепочки редиректов
- bertal.ru — проверка заголовков HTTP
- Screaming Frog SEO Spider — массовая проверка всего сайта
- Яндекс.Вебмастер / Google Search Console — статус индексации
Типичные ошибки
- Поставить 302 вместо 301 (вес не передаётся)
- Редирект на нерелевантную страницу (Google это видит)
- Цепочка из 5+ редиректов → замедление и
ERR_TOO_MANY_REDIRECTS - Редирект файла
robots.txt(нельзя!) - Перепутать rel=canonical и 301 — это разные инструменты для разных задач
- 301 со старого забаненного домена — бан переедет вместе с трафиком
Главное правило: один прямой редирект со старого URL на новый, без цепочек, с флагом [R=301,L] в .htaccess или кодом 301 в заголовке. Всё остальное — детали реализации в зависимости от сервера и CMS.
