Все більш широке впровадження протоколу 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» був підготовлений дружною командою проекту Сайтостроение від А до Я.