Редирект на HTTPS через .htaccess
Перед налаштуванням переконайтеся, що SSL-сертифікат уже встановлено на домені — без нього редирект приведе відвідувача на сторінку з помилкою сертифіката замість робочого сайту. Перевірити встановлення можна в статті про підключення безкоштовного SSL.
Універсальний редирект
Відкрийте файл .htaccess у корені сайту та додайте:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Код відповіді 301 означає «переміщено назавжди» — саме він потрібен для HTTPS-редиректу, щоб пошукові системи і браузери запам'ятали нову адресу і не зберігали кеш старого HTTP-варіанта. Тимчасовий редирект 302 для цього завдання не підходить.
Редирект з www на без www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
Редирект через WordPress
У WordPress в розділі Settings → General вкажіть адреси з https://. WordPress сам додасть потрібні правила і підмінить внутрішні посилання в базі даних на нову схему.
Об'єднання www і HTTPS в одному правилі
Якщо робити редирект на HTTPS і редирект www окремими блоками, відвідувач з адреси http://www.yourdomain.com пройде два переходи поспіль: спершу на https://www.yourdomain.com, потім на https://yourdomain.com. Кожен зайвий перехід — це зайвий round-trip до сервера і невелика втрата швидкості завантаження. Правильніше об'єднати обидві умови в одне правило:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://yourdomain.com/$1 [L,R=301]
Так відвідувач потрапляє на кінцеву адресу одним кроком, незалежно від того, з якого варіанта він зайшов.
Реальні помилки при налаштуванні редиректу
Найчастіша проблема — нескінченний цикл редиректів, який браузер показує так:
ERR_TOO_MANY_REDIRECTS
Вона виникає, коли сайт перебуває за Cloudflare чи іншим проксі-сервером у режимі SSL «Flexible»: Cloudflare віддає запит на origin-сервер по HTTP, .htaccess бачить HTTP і редиректить на HTTPS, Cloudflare заново відкриває HTTP-з'єднання — і цикл повторюється нескінченно. Рішення — перемкнути режим SSL у Cloudflare на «Full» чи «Full (strict)», або перевіряти заголовок X-Forwarded-Proto замість змінної HTTPS напряму. Друга помилка з'являється, якщо правило додано двічі в різних .htaccess файлах (кореневий і в піддиректорії):
Internal Server Error
500 - RewriteRule: bad flag delimiters
Вона означає синтаксичну помилку в правилі — найчастіше зайвий пробіл або неекранований спецсимвол у регулярному виразі.
Способи редиректу: порівняння
| Спосіб | Де налаштовується | Ризик конфлікту з Cloudflare |
|---|---|---|
| .htaccess RewriteRule | Файл на хостингу | Високий у режимі Flexible |
| Налаштування WordPress | Адмін-панель CMS | Середній, залежить від плагіна кешу |
| Always Use HTTPS у Cloudflare | Панель Cloudflare | Низький, редирект до origin-сервера |
Коли редирект через .htaccess не підходить
- Сайт перебуває за Cloudflare чи іншим CDN — правильніше увімкнути редирект на рівні проксі (Always Use HTTPS), а не дублювати його в .htaccess
- Використовується статичний сайт без Apache (наприклад, відданий через Nginx чи CDN-хостинг) — директиви .htaccess там просто не читаються
- Потрібен редирект за умовою (країна, пристрій, мова) — стандартний HTTPS-редиректор для цього не призначений, потрібна окрема логіка в застосунку
- Сайт використовує агресивне кешування редиректів у браузері — старе правило може «залипнути» навіть після виправлення .htaccess
Наступний крок: HSTS
Редирект на HTTPS захищає лише тих, хто вже надіслав хоча б один запит по HTTP, — сам цей перший запит усе ще вразливий до перехоплення. Щоб браузер одразу, без жодного HTTP-запиту, звертався до сайту по HTTPS, додайте заголовок HSTS до .htaccess:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Вмикати цей заголовок варто лише після того, як редирект на HTTPS перевірено і стабільно працює на всіх піддоменах — HSTS запам'ятовується браузером на вказаний строк (у прикладі це рік), і відкотити його достроково простим вимкненням редиректу не вийде.
Перевірка редиректу
- Виконайте
curl -I http://yourdomain.com— відповідь має містити заголовокHTTP/1.1 301таLocation: https://yourdomain.com/ - Перевірте варіант з www:
curl -I http://www.yourdomain.com - Скористайтеся сервісом redirect-checker.org для перевірки повного ланцюжка редиректів — якщо він довший за один крок, пошукові системи втрачають частину ваги сторінки на кожному переході
Якщо сайт працює через Cloudflare, режими шифрування та їхній вплив на редиректи розібрано в статті про режими SSL/TLS у Cloudflare. Загальні правила .htaccess, включно із захистом від прямого доступу до файлів, — у статті .htaccess: правила редиректів і оптимізації.