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.