Apache редирект c www на без www и с протокола HTTP на HTTPS

Все более широкое внедрение протокола 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»