301 редирект используют, когда нужно передать новой странице весь накопленный старой страницей ссылочный вес. Например, при удалении страницы, смене её URL-адреса или переносе сайта на новый домен.
Эта статья — полное руководство по настройке редиректа 301 в .htaccess. В ней вы найдёте готовые команды для редиректов в разных ситуациях, научитесь создавать собственные команды, а также исправлять типичные ошибки.
Содержание
- Как сделать 301 редирект в .htaccess
- Как составить свою команду для редиректа в .htaccess
- Распространённые проблемы с 301 редиректами
- Когда 301 редирект лучше не использовать
- Плагины для настройки 301 редиректа в WordPress
Как настроить 301 редирект в .htaccess
В этом разделе вы найдёте готовые команды для настройки 301 редиректа в .htaccess. Вам останется только скопировать их и подставить свой домен вместо примера. Если не найдёте здесь подходящей команды, в следующем разделе будут инструкции, как создать её самостоятельно.
Если у вас домен с кириллическими символами, его нужно сначала преобразовать в Punycode. Правила с символами не из латинского алфавита в .htaccess работать не будут.
Где находится .htaccess
Для тех, кто вдруг сталкивается с этой темой впервые, файл .htaccess можно найти в корневой папке сайта. Для основного домена на хостинге она обычно называется public_html, а для дополнительного — так же как и сам домен.
Если не получается найти .htaccess в корневой папке, возможно, он просто скрыт и вам нужно включить отображение скрытых файлов.
301 редирект с одной страницы на другую
Если вы хотите удалить страницу или изменить её URL, но она уже попала в индекс Google и набрала какие-то позиции, 301 редирект поможет не потерять накопленный вес.
Redirect 301 /old-page /new-page
301 редирект с одного файла на другой
Если вы изменили название индексного файла какой-то из страниц, старые ссылки на эту страницу перестанут работать. Чтобы этого не произошло и люди продолжили попадать на ваш сайт, нужно настроить редирект.
Redirect 301 /contact-us.php /contact.php
301 редирект с одного домена на другой
При помощи одной простой команды вы можете настроить редирект всех страниц на старом домене на точно такие же страницы на новом домене. Это удобно, если при смене домена структура ссылок остаётся такой же. Но если структура ссылок меняется, придётся делать постраничный редирект.
Redirect 301 / https://new-domain.com/
При переносе сайта на новый домен, просто настроить 301 редирект недостаточно. Полный список необходимых действий вы найдёте у нас в блоге:
Как сменить домен и не потерять позиции
301 редирект с поддомена на подпапку
Например, у вашего блога был адрес blog.domain.com, но вы решили сменить этот адрес на domain.com/blog. Тогда нужно добавить такой редирект в .htaccess, который находится в корневой папке поддомена blog.domain.com:
RewriteCond %{HTTP_HOST} ^blog\.domain\.com$ [NC] RewriteRule ^(.*)$ https://domain.com/blog/ [R=301,L]
301 редирект одного расширения на другое
Такой редирект может быть необходим, если вы изменили структуру страниц и вместо файлов .html стали использовать .php. Либо вы хотите заменить все .jpeg картинки на сайте на такие же файлы, но с расширением .png.
RedirectMatch 301 ^(.*)\.html /$1.php
301 редирект с HTTP на HTTPs
После установки SSL-сертификата сайт будет открываться как по HTTPs так и по HTTP. Чтобы защищённая версия сайта открывалась, даже если человек специально добавит http:// в браузере, нужно настроить 301 редирект на HTTPs. Для этого добавьте в .htaccess такое правило:
RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://domain.com/$1 [R=301,L]
301 редирект с WWW на без WWW
Поисковики воспринимают одну и ту же страницу с WWW и без WWW как дубликаты. Дубликаты это плохо, поисковики их не любят. Поэтому стоит выбрать какой-то один вариант написания ссылок и настроить на него 301 редирект со всех других вариантов.
Если сайт новый, основным может быть любой вариант написания, разницы нет. Если сайт уже набрал позиции, лучше выбрать тот вариант, у которого больше страниц в результатах поиска.
Это можно проверить двумя способами:
- загуглить по очереди обе версии домена с оператором “site” (site:domen.com и site:www.domen.com) и посчитать, у какого варианта больше результатов в выдаче;
- добавить обе версии сайта в Google Search Console и проверить количество страниц в индексе там. Этот вариант будет более точным.
Чтобы настроить 301 редирект с WWW на без WWW, добавьте в .htaccess такой код:
RewriteCond %{HTTP_HOST} ^www\. RewriteRule ^(.*)$ https://domain.com/$1 [R=301,L]
Если вам наоборот нужно настроить редирект 301 с без WWW на WWW, используйте такое правило:
RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ https://www.domen.com/$1 [R=301,L]
301 редирект с без слеша на слэш
Так же как в предыдущем примере, поисковики будут воспринимать страницу со слешем в конце и страницу без слеша как дубликаты.
Чтобы случайно не нарваться на санкции от поисковиков, будет правильно привести всё к одному варианту. Вот правило, которое добавит редирект 301 для ссылок без слеша на ссылки со слешем:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ /$1/ [L,R=301]
Если хотите, чтобы все ссылки наоборот были без слеша, добавьте в .htaccess такое правило:
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^(.+)/$ RewriteRule ^(.*)$ /$1 [L,R=301]
301 редирект на URL без расширения
Допустим, у вас есть страница https://domain.com/about.html, и вы бы хотели, чтобы в адресной строке отображалось только https://domain.com/about. В таком случае добавьте такое правило:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.+)$ $1.html [L,QSA] RewriteCond %{THE_REQUEST} ^[a-z]{3,9}\ /.*\.html\ HTTP/ RewriteRule ^(.*)\.html$ /$1 [R=301,L]
Если нужен редирект не для .html, а для другого расширения, напишите в нужных местах в правиле именно его.
301 редирект с верхнего регистра на нижний
Как и в предыдущих примерах, для поисковых ботов ссылки с разным регистром — https://domain.com/home и https://domain.com/Home — это две разные страницы.
Обычно никто специально не создаёт такие дубликаты, но некоторые движки делают это автоматически. В этом случае лучше выбрать какой-то главный вариант и настроить на него 301 редирект со всех остальных.
Лучше всего делать такой при помощи .htaccess и PHP. Можно, конечно, только при помощи .htaccess, но тогда придётся прописывать команды для проверки каждой буквы. Это будет создавать дополнительную нагрузку на Apache. Скорее всего, незначительную, но всё равно. Поэтому лучше делать в два этапа. Для этого добавьте в .htaccess такой код:
RewriteCond %{REQUEST_URI} [A-Z][OR] RewriteCond %{QUERY_STRING} [A-Z] RewriteCond %{REQUEST_FILENAME} !-s RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]
Затем создайте в этой же папке файл rewrite-strtolower.php и добавьте в него строки:
<?php if(isset($_GET['rewrite-strtolower-url'])) { $url = $_GET['rewrite-strtolower-url']; unset($_GET['rewrite-strtolower-url']); $params = http_build_query($_GET); if(strlen($params)) { $params = '?' . $params; } // Если на целевом ресурсе нет SSL сертификата, замените https:// на http:// ниже header('Location: https://' . $_SERVER['HTTP_HOST'] . '/' . strtolower($url) . $params, true, 301); exit; } header("HTTP/1.0 404 Not Found"); die('Unable to convert the URL to lowercase. You must supply a URL to work upon.');
Как сделать свою команду для 301 редиректа в .htaccess
Этот раздел — для тех, кто не нашёл среди готовых правил для .htaccess подходящего и хочет попробовать создать его самостоятельно. Ну или для тех, кто хочет понять, как работают все эти случайные на первый взгляд комбинации специальных символов в правилах.
Команда Redirect
Это команда для настройки простого редиректа — когда нужно перенаправить один URL или группу URL в другое место. Её синтаксис выглядит вот так:
В этой команде:
- Аргумент — это код редиректа. Например, 301. Если не указать код, редирект будет расцениваться как временный (код 302).
- Старый URL — это абсолютный адрес на вашем домене. Чтобы настроить редирект для https://domain.com/blog/, здесь нужно указать только /blog/.
- Новый URL — это либо абсолютный адрес на вашем домене, либо полный URL на другом домене.
Важный нюанс — команда сохраняет полный путь из запроса посетителя. Это значит, что редирект для папки /shop/ сработает также для любого другого URL-адреса, который начинается с /shop/. Объясним на примере:
Redirect 301 /shop https://shop.domain.com
При таком 301 редиректе в .htaccess, если посетитель введёт https://domain.com/shop/, его перенаправит на https://shop.domain.com/. Если в запросе будет что-то ещё после /shop/, эта часть URL тоже сохранится. Например, https://domain.com/shop/men/jeans/ перенаправится на https://shop.domain.com/men/jeans/.
То же самое касается и параметров GET в адресе. Это значит, что вышеупомянутом редиректе запрос https://domain.com/shop/index.php?q=12&a=34 перенаправится на https://shop.domain.com/index.php?q=12&a=34.
Команда RedirectMatch
Это эквивалент команды Redirect, но с возможностью использовать регулярные выражения. Они состоят из специальных символов и переменных. Вот самые популярные из них:
- ^ — начало строки;
- $ — конец строки;
- . — любой символ;
- ! — символ отрицания;
- | — символ «или»;
- () — используется, чтобы сгруппировать несколько символов;
- * — повторить предыдущий символ от 0 до 65536 разов;
- [0-9] — любая цифра от 0 до 9;
- [A-Z] — любая буква от A до Z в верхнем регистре;
- [a-z] — любая буква от A до Z в нижнем регистре;
- [a-Z] — любая буква от A до Z в любом регистре;
- [A-Z]{3,6} — любая строка, которая заканчивается на последовательность от 3 до 6 букв в верхнем регистре и диапазоне от A до Z;
- [0-9]{3,6} — любая строка, которая заканчивается на последовательность от 3 до 6 цифр в диапазоне от 0 до 9;
- \ — экранирующий слэш (следующий символ после него будет считаться обычным, а не спецсимволом). Такой слэш обычно используют перед точкой в расширении файла, потому что сама по себе точка означает «любой символ».
Рассмотрим такой пример редиректа с использованием регулярного выражения:
RedirectMatch 301 ^(.*)\.html /$1\.php
Этот 301 редирект перенаправит все файлы с расширением .html на файлы с таким же названием, но расширением .php.
Комбинация символов ^(.*)$ буквально означает «любое количество любых символов». Это популярный паттерн, который часто используют в других регулярных выражениях. Запомните его.
Скобки нужны только для того, чтобы можно было использовать переменную $1. Эта переменная буквально означает «то, что находится в скобках».
Если в регулярном выражении несколько последовательностей символов в скобках, используйте $1, чтобы подставить содержимое в первых скобках, $2, чтобы подставить содержимое во вторых скобках, и так далее.
Команда RewriteRule
Эта команда позволяет создавать редиректы с ещё более сложными условиями. Она относится к модулю Apache mod_rewrite, который отвечает за преобразование URL. Обычно её используют в комбинации с другими командами:
- RewriteEngine — команда, которая активирует механизм преобразования;
- RewriteBase — адрес, к которому нужно применить правило (корень домена или какая-то конкретная папка);
- RewriteCond — условие, при котором должен произойти редирект;
- RewriteRule — действие, которое веб-сервер должен выполнить, если запрос соответствует условию из команды RewriteCond.
Вот пример с синтаксисом команд:
RewriteEngine On
RewriteBase /
RewriteCond %{Переменная} Условие Флаг
RewriteRule Старый URL Новый URL Флаг
Команды RewriteEngine и RewriteBase достаточно указать один раз в начале .htaccess. Больше их повторять не нужно.
RewriteEngine On RewriteBase /
Переменные в команде RewriteCond дают возможность использовать информацию из заголовков запроса. Вот несколько самых популярных:
- %{HTTP_HOST} — проверяет, совпадает ли домен из запроса с доменом в условии команды. Например, если в команде используется эта переменная с условием ^domain.com$, это означает «выполнить редирект, если человек ввёл в браузере domain.com». Если человек введёт www.domain.com, редирект не сработает.
- %{HTTPS} — проверяет, был ли запрос отправлен по HTTPs протоколу. Например, если в команде стоит эта переменная и условие !=on, это будет значить «выполнить редирект, если запрос не был отправлен по HTTPs протоколу». Запросы по протоколу HTTPs обрабатываться не будут.
- %{REQUEST_FILENAME} — проверяет, является ли URL в запросе путём к файлу или папке. Обычно в условии для этой переменной используют аргумент -f (файл) или -d (папка). Например, если в команде стоит эта переменная и аргумент !-f, это значит, что нужно пропустить запрос, если по адресу из этого запроса расположен файл.
- %{REQUEST_URI} — содержимое запроса после доменного имени. Например, в запросе https://domain.com/account/dashboard переменная символизирует текст /account/dashboard. Если в команде используется эта переменная, а за ней [A-Z], значит команда должна сработать, только если после домена в запросе есть большие буквы.
- %{QUERY_STRING} — GET параметры из запроса (то, что идёт в URL после символа ?). Например, в запросе https://domain.com/results/?krossovki=adidas переменная символизирует кусочек ?krossovki=adidas.
Флаги — это дополнительные атрибуты, при помощи которых задают дополнительное действие после обработки команды или указывают тип редиректа. Их всегда указывают в квадратных скобках. Если нужно использовать несколько флагов, их перечисляют через запятую, например, [L, R=301]. Вот самые популярные из них:
- [L] — остановить процесс преобразования и не учитывать другие команды. Обычно этот флаг используют в конце каждой команды.
- [NC] — не учитывать регистр символов при обработке правила.
- [OR] — альтернативное условие. Таким образом можно указать больше чем одну команду RewriteCond и редирект произойдёт при выполнении хотя бы одного из условий.
- [R=301] — редирект вместе с его кодом. Если специально не прописать число, оставить только букву R, сработает 302 редирект. Так что для постоянного редиректа прописывайте вручную код 301.
В качестве старого и нового URL, а также условия можно использовать как простой текст, так и регулярные выражения.Разберём такой пример редиректа с использованием команды RedirectRule:
RewriteCond %{HTTP_HOST} ^www\. RewriteRule ^(.*)$ https://domain.com/$1 [R=301,L]
Это редирект с www на без www. Здесь условие в строке RewriteCond предписывает: команду нужно выполнить, только если домен в запросе (переменная HTTP_HOST) начинается с (символ ^) поддомена www. (чтобы точка после www трактовалась именно как точка, а не «любой символ», используется экранирующий слеш).
Дальше правило в строке RewriteRule предписывает: нужно взять текст запроса (комбинация символов ^(.*)$ означает «любое количество любых символов») и подставить его к URL https://domain.com/$1 (переменная $1 символизирует то, что указано в скобках).
Флаг R=301 говорит о том, что это должен быть 301 редирект, а флаг L — что команду нужно выполнить сразу, без учёта команд, которые идут дальше.
RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://domain.com/$1 [R=301,L]
Это редирект с HTTP на HTTPs. Здесь условие в строке RewriteCond предписывает: команду нужно выполнить, только если в запросе не использовался (комбинация !=on буквально означает «не включён» — знак отрицания вместе с атрибутом «on») протокол HTTPs (переменная HTTPS).
Дальше правило в строке RewriteRule предписывает: нужно взять текст запроса (комбинация символов ^(.*)$ означает «любое количество любых символов») и подставить его к URL https://domain.com/$1 (переменная $1 символизирует то, что указано в скобках).
Флаг R=301 говорит о том, что это должен быть 301 редирект, а флаг L — что команду нужно выполнить сразу, без учёта команд, которые идут дальше.
Распространённые проблемы с 301 редиректами
Если настроить редирект 301 неправильно, конечная страница может не открываться или редирект не будет оказывать ожидаемого эффекта — ссылочный вес не будет передаваться. Вот часто встречающиеся ошибки, на которые стоит обратить внимание.
Редирект не работает
Если после добавления редиректа в .htaccess ничего не происходит, возможно, команды расположены в неправильном порядке. Попробуйте поставить команду, которая не срабатывает, в самое начало файла.
Тут дело вот в чём: когда Apache выполняет команду RewriteRule, преобразованный запрос проходит проверку заново — подходят ли к нему какие-то другие правила. В итоге может случиться так, что вышестоящая директива преобразовала запрос таким образом, что он больше не подходит под условия в следующих директивах.
Если у вас сайт на WordPress, обязательно размещайте ВСЕ команды RewriteRule до фронт-контроллера движка. Он начинается с комментария # BEGIN WordPress и заканчивается комментарием # END WordPress.
Цепочки редиректов
Это когда при переходе по ссылке происходит больше одного редиректа, прежде чем откроется конечная страница. Например, сначала редирект на страницу с протоколом HTTP, а потом дополнительно редирект с HTTP на HTTPs.
Поисковые роботы не любят цепочки редиректов. Плюс каждый новый редирект — это дополнительная нагрузка на веб-сервер, из-за чего страница загружается медленнее. По возможности стоит избегать таких настроек.
Проанализировать свой сайт и найти на нём цепочки редиректов можно при помощи сервиса httpstatus или программы Screaming Frog.
Циклические редиректы
Это логическая ошибка при настройке редиректа, когда один URL адресов ведёт на предыдущий адрес в цепочке редиректов и так по кругу. В результате страница долго не загружается и в браузере выскакивает ошибка ERR_TOO_MANY_REDIRECTS.
Иногда такое случается, когда администратор сайта пытается настроить редирект с домена без WWW на домен с WWW, но в DNS-записях домена создана запись CNAME, которая перенаправляет домен с WWW на версию без WWW.
Проверить свой сайт на подобные ошибки можно при помощи программы Screaming Frog.
Битые редиректы
Это когда конечная страница не открывается и возвращает HTTP-код 4хх или 5хх. Например, 403 Forbidden или 500 Internal Server Error. Про другие подобные ошибки читайте в статье: Коды ошибок HTTP.
В подобной ситуации ни посетители, ни поисковые роботы не могут попасть на конечный URL-адрес. Если не исправить эту ошибку на конечной странице, она рискует выпасть из поискового индекса.
Проверить сайт на подобные ошибки тоже можно при помощи программы Screaming Frog. Также уведомления об ошибках будут отображаться в Google Search Console, если вы добавляли туда свой домен.
В каких ситуациях 301 редирект лучше не использовать
Иногда на сайтах встречаются дубликаты страниц, которые нельзя удалить. Например, один и тот же товар доступен сразу по нескольким URL или у страницы есть версия для мобильного.
В лучшем случае Google выберет одну из страниц и будет считать её канонической, в худшем — будет считать обе страницы равноценными и это приведёт к санкциям.
В такой ситуации лучше самостоятельно сообщить Google, какую страницу считать канонической. Для этого нужно добавить ей атрибут rel=”canonical”. Это делается в коде страницы между тегами <HEAD></HEAD>.
Атрибут rel=”canonical” говорит поисковикам: у страницы есть дубликаты, но конкретно эту нужно считать главной. В итоге именно она будет отображаться в результатах поиска, на неё перейдёт ссылочный вес и другие характеристики дубликатов.
Рекомендации Google по использованию атрибута rel=”canonical”
Плагины для настройки 301 редиректа в WordPress
Если у вас сайт WordPress, вы можете немного упростить себе жизнь при помощи плагинов.
Yoast — плагин для настройки SEO на сайте. С его помощью можно открыть содержимое .htaccess прямо в консоли WordPress. Это удобнее, чем каждый раз заходить в менеджер файлов в панели управления хостингом. Редактор .htaccess в Yoast находится в разделе «Инструменты» – «Редактор файлов».
Redirection — самый нормальный плагин для настройки редиректов с русскоязычным интерфейсом. Кроме основного функционала также отслеживает 404 ошибки на сайте и показывает, сколько раз люди переходили по адресам, для которых настроен редирект.
Htaccess File Editor — ещё один плагин, который даёт возможность редактировать файл .htaccess прямо в консоли WordPress.
Что дальше
Теперь вы знаете, как сделать 301 редирект на своём сайте. Расскажите в комментариях, нашли ли вы ответы на свои вопросы в статье. Возможно, какие-то команды для .htaccess не сработали или вы не нашли нужную команду. Постараемся разобраться вместе.