Все більш широке впровадження протоколу HTTPS поставило кілька нових завдань перед розробниками і системними адміністраторами. Таких, як необхідність перенаправлення з http https.
Введення
Нижче я покажу, як перенаправити сайт з www на без-www (або навпаки) і з http на https, використовуючи конфігурацію сервера Apache. Щоб стало зрозуміліше, конфігурація буде перенаправляти наступні імена хостів:
http://example.com
http://www.example.com
https://example.com
на
https://example.com
Також я покажу невелика зміна для перенаправлення без-WWW на версію з WWW, якщо ви віддаєте перевагу WWW.
Конфігурація Apache
Перед тим, як зробити редирект з https на http, додайте наступне правило перенаправлення файл конфігурації Apache (якщо у вас є доступ до нього), або у файл .htaccess, розташований в кореневому каталозі вашого сайту:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www. [NC]
RewriteCond %{HTTP_HOST} ^(?:www.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
Якщо замість example.com ви хочете використовувати за умовчанням URL www.example.com, то просто змініть третю і п’яту рядки:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTP_HOST} ^(?:www.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
Як це працює?
Спробуємо розібратися, як працює ця конфігурація htaccess редіректу http https. Це допоможе внести необхідні зміни:
RewriteEngine On
Перший рядок дозволяє Apache запустити механізм перетворення http посилань, необхідний для виконання перенаправлення:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www. [NC]
Ці два рядки — умови перенаправлення, вони використовуються для визначення того, чи повинен запит бути перенаправлений. Якщо будь-яка з цих двох умов поверне true, то Apache виконає перенаправлення, оскільки умови з’єднуються за допомогою [OR].
Перша умова визначає, чи використовує запит URL не-HTTPS. Друга умова визначає, чи використовує запит URL www. Зауважте, я використовував www.а не www., тому що зразок є регулярним виразом і крапка тут використовується для екранування. Отже, її потрібно залишити:
RewriteCond %{HTTP_HOST} ^(?:www.)?(.+)$ [NC]
Четвертий рядок — вона відповідає імені хоста вхідного запиту, і поділяє його на www частина (якщо така є), і решту імені хоста. Ми будемо посилатися на неї пізніше %1 в RewriteRule.
Якщо ви знаєте ім’я хоста заздалегідь, то можна поліпшити правило перенаправлення з http на https, вмонтувавши URL і пропустивши це умова (приклад нижче):
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
RewriteRule – центральний елемент перенаправлення. За допомогою цього рядка ми приписуємо Apache перенаправити будь-який запит на новий URL, який складається з:
- https: // WWW;
- %1: Посилання на без-WWW частина хоста;
- %{REQUEST_URL}: URL запит, без імені хоста.
Всі ці маркери з’єднані один з одним, і являють собою кінцевий URL перенаправлення. В кінці ми додаємо три прапори:
- NE — щоб не вийти із спеціальних символів;
- R=301 — використовувати HTTP статус 301 редіректу;
- L — припинити обробку інших правил, та негайно передати.
Зауваження
В моєму прикладі htaccess редіректу http на https використовується додаткова рядок RewriteCond, щоб отримати ім’я хоста, а не підставляти ім’я в правило. Якщо відчуваєте, що для вас це — втрата продуктивності, то можете вбудувати хост безпосередньо в правило:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
Висновок
У даній статті представлена проста конфігурація перенаправлення WWW і не-HTTPS — запитів для домену сайту. Таким чином можна уникнути проблем з дублюванням контенту в пошукових системах.
Переклад статті «Apache redirect www to non-www and HTTP to HTTPS» був підготовлений дружною командою проекту Сайтостроение від А до Я.