Перенаправление с HTTP на HTTPS через .htaccess (редирект 301)

Опубликовано Обновлено 4 мин. чтения

Посетители всё ещё попадают на незашифрованную версию сайта? Несколько строк в файле .htaccess переводят каждый вызов по HTTP на HTTPS постоянным редиректом 301.

Ваш сервер уже отдаёт сайт по HTTPS, но посетители по-прежнему попадают на незашифрованную версию по HTTP? Значит, не хватает перенаправления. В этом руководстве вы настроите постоянный редирект (код состояния 301) с HTTP на HTTPS с помощью файла .htaccess.

Редирект 301 правильный выбор и с точки зрения SEO: поисковые системы переносят позиции старого адреса HTTP на адрес HTTPS, вместо того чтобы считать оба варианта разными страницами.

Что понадобится

  • На вашем сервере работает Apache. Для nginx конфигурация выглядит иначе, об этом ниже.
  • Действующий SSL-сертификат уже настроен. Если нет, подходящее руководство есть в статье Бесплатный SSL-сертификат с Let's Encrypt.
  • У вас есть доступ к веб-каталогу сервера, по SSH или по FTP.

Важно: настраивайте перенаправление только после того, как HTTPS заработает. Иначе вы отправите посетителей на адрес, который встретит их предупреждением о сертификате.

Включение mod_rewrite и разрешение .htaccess

Перенаправление опирается на модуль Apache mod_rewrite. Включите его и перезапустите Apache:

a2enmod rewrite
systemctl restart apache2

Чтобы Apache вообще читал файл .htaccess, VirtualHost должен это разрешать. Проверьте в конфигурации в каталоге /etc/apache2/sites-available/, задан ли для вашего каталога параметр AllowOverride All:

<Directory /var/www/MeineDomain.de>
    AllowOverride All
    Require all granted
</Directory>

Если там стоит AllowOverride None, ваш файл .htaccess будет молча проигнорирован. После изменения файла VirtualHost нужен перезапуск Apache.

Создание файла .htaccess

Перейдите в каталог, в котором лежит ваш сайт:

cd /var/www/<ВАШ-ВЕБ-КАТАЛОГ>

Откройте файл .htaccess в редакторе. Если его ещё нет, команда его создаст:

nano .htaccess

Впишите следующие строки. Этот вариант напрямую проверяет, зашифровано ли соединение, и добавляет к цели весь запрошенный путь:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Сохраните файл сочетанием «CTRL + X», затем «Y» и «Enter».

Альтернатива через порт сервера

На старых конфигурациях, где переменная HTTPS не задаётся, вместо неё работает проверка порта:

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

Вариант за reverse proxy или балансировщиком нагрузки

Если перед вашим Apache стоит reverse proxy или балансировщик нагрузки, который сам завершает шифрование, до Apache запрос доходит незашифрованным. Правило выше в такой ситуации перенаправляло бы бесконечно. Тогда разбирайте заголовок, который передаёт прокси:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Проверка перенаправления

Откройте свой домен в браузере по http://. Вы должны сразу оказаться на https://. В командной строке код состояния проверяется напрямую:

curl -I http://MeineDomain.de

В выводе должна быть строка HTTP/1.1 301 Moved Permanently и строка Location с адресом HTTPS. Если вместо этого появляется код 302, проверьте, действительно ли в правиле указано R=301.

Включение HSTS (по желанию)

С помощью HTTP Strict Transport Security вы указываете браузеру впредь вообще не обращаться к вашему домену по HTTP. Так отпадает первый незащищённый запрос. Сначала включите нужный модуль:

a2enmod headers
systemctl restart apache2

Затем допишите в файл .htaccess:

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>

Учтите: HSTS задаёт срок в один год. Пока это значение сохранено в браузере, домен по HTTP уже недоступен. Устанавливайте заголовок только тогда, когда HTTPS работает надёжно и у всех поддоменов тоже есть действующий сертификат.

Частые ошибки

  • Бесконечный цикл («too many redirects»): почти всегда следствие прокси перед сервером. Используйте вариант с X-Forwarded-Proto.
  • Ничего не происходит: либо не активен mod_rewrite, либо VirtualHost не разрешает файл .htaccess (AllowOverride None).
  • Ошибка 500 после сохранения: опечатка в файле .htaccess. Точная причина записана в журнале ошибок Apache в /var/log/apache2/error.log.
  • Смешанное содержимое: страница загружается по HTTPS, но изображения или скрипты по-прежнему подключаются по HTTP. Исправьте эти адреса в исходном коде или в базе данных.
  • Файл не находится: имя .htaccess начинается с точки, поэтому файл скрытый. Команда ls -la его показывает.

Перенаправление без .htaccess

Файл .htaccess считывается заново при каждом отдельном запросе. Если у вас есть доступ к конфигурации сервера, быстрее прописать правила прямо в VirtualHost. Для HTTP-VirtualHost достаточно такого блока:

<VirtualHost *:80>
    ServerName MeineDomain.de
    Redirect permanent / https://MeineDomain.de/
</VirtualHost>

Если вы используете nginx вместо Apache, файлов .htaccess там нет. Перенаправление вписывается в блок server для порта 80:

server {
    listen 80;
    server_name MeineDomain.de www.MeineDomain.de;
    return 301 https://$host$request_uri;
}

Частые вопросы

Почему редирект 301, а не 302?
301 означает постоянное перенаправление. Поисковые системы переносят с его помощью оценку прежнего адреса HTTP на адрес HTTPS. Код 302 считается временным и такие сигналы не передаёт.
Мой файл .htaccess игнорируется. В чём причина?
Либо не включён mod_rewrite, либо VirtualHost не разрешает переопределения. Задайте для вашего каталога AllowOverride All и после этого перезапустите Apache.
Почему я попадаю в бесконечный цикл перенаправлений?
Почти всегда так происходит, когда перед Apache шифрование завершает reverse proxy или балансировщик нагрузки. В этом случае разбирайте заголовок X-Forwarded-Proto вместо переменной HTTPS.
Работает ли это с nginx?
Нет, файлов .htaccess nginx не знает. Там перенаправление вписывается прямо в блок server для порта 80 строкой return 301 https://$host$request_uri.
Стоит ли дополнительно включать HSTS?
HSTS повышает безопасность, но фиксирует вас на указанный срок. Включайте его только тогда, когда HTTPS надёжно работает и на самом домене, и на всех поддоменах.

.htaccess Перенаправление Редирект 301 HTTPS Apache mod_rewrite HSTS