Перенаправление с HTTP на HTTPS через .htaccess (редирект 301)
Посетители всё ещё попадают на незашифрованную версию сайта? Несколько строк в файле .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?
Мой файл .htaccess игнорируется. В чём причина?
Почему я попадаю в бесконечный цикл перенаправлений?
Работает ли это с nginx?
Стоит ли дополнительно включать HSTS?
2022-2026 KernelHost GmbH. Все права защищены. Эта инструкция охраняется авторским правом. Публикация на других сайтах, в том числе частично или в изменённом виде, без нашего письменного согласия не разрешается. Цитирование с указанием источника и активной ссылкой мы приветствуем.

