301 редирект використовують, коли потрібно передати новій сторінці всю накопичену старою сторінкою вагу в пошукових системах. Наприклад, при видаленні сторінки, зміні її URL-адреси чи перенесенні сайту на новий домен.

Ця стаття — докладна інструкція з налаштування редиректа 301 в .htaccess. В ній ви знайдете готові правила для редиректів у різних ситуаціях, навчитеся створювати власні команди, а також виправляти типові помилки.

Зміст

  1. Як зробити 301 редирект у .htaccess
  2. Як скласти свою команду для редиректу в .htaccess
  3. Поширені проблеми з 301 редиректом
  4. У яких ситуаціях 301 редирект краще не використовувати
  5. Плагіни для налаштування 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 редирект з HTTP на 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://domen.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 в інше місце. Її синтаксис виглядає ось так:

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 редирект.

У якості старого і нового 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 не спрацювали або ви не знайшли потрібну команду. Постараємось розібратися разом.

Чи була ця стаття корисною?

Дякуємо за відгук!