Редирект HTTP → HTTPS в .htaccess: 301, прокси и типичные циклы

Редирект HTTP→HTTPS через .htaccess — базовая гигиена для Apache/BitrixVM/Beget. Ниже рабочий сниппет, разбор флагов, варианты за прокси/Cloudflare и частые ошибки, из‑за которых получается цикл или смешанный контент.

Базовый 301 в .htaccess

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • RewriteEngine On — включает mod_rewrite.
  • RewriteCond %{HTTPS} off — правило только для незашифрованного запроса.
  • R=301 — постоянный редирект (для SEO лучше, чем 302, когда HTTPS уже основной канонический адрес).
  • L — не применять следующие rewrite-правила к этому запросу.

Файл кладётся в корень сайта (для Битрикс — обычно рядом с /bitrix и index.php). Порядок важен: редирект на HTTPS должен стоять до «красивых URL», которые уже предполагают конечный хост.

Сайт за reverse-proxy / Load Balancer

Если TLS терминируется на балансировщике, бэкенд часто видит обычный HTTP. Тогда %{HTTPS} off всегда истинно и вы ловите цикл. Смотрите заголовок от прокси:

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

На BitrixVM/nginx+Apache схема может отличаться: иногда HTTPS-редирект делают на nginx, а в .htaccess его дублировать не нужно. Один слой редиректа — меньше сюрпризов.

www и HTTPS одним проходом

Два последовательных редиректа (сначала https, потом www) ухудшают TTFB и размывают сигналы. Лучше сразу на канонический хост:

RewriteEngine On

# http://example.ru и http://www.example.ru → https://example.ru
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.ru$ [NC]
RewriteRule ^ https://example.ru%{REQUEST_URI} [L,R=301]

Битрикс: HTTPS в настройках

Мало поставить редирект. В настройках главного модуля / сайта включите HTTPS, проверьте https:// в шаблонах писем и в SITE_SERVER_NAME. Иначе агенты и почтовые ссылки продолжат генерировать http://, а браузер будет ругаться на смешанный контент.

Проверка

curl -I http://example.ru/
# ждём HTTP/1.1 301 и Location: https://example.ru/

curl -I https://example.ru/
# ждём 200 (или ваш обычный ответ), без нового редиректа на себя

В DevTools → Security убедитесь, что сертификат валиден и нет mixed content (картинки/скрипты по http).

Типичные ошибки

  • Редирект за прокси по %{HTTPS} → бесконечный цикл.
  • Цепочка http→https→www→без www — лишние 301.
  • Сертификат только на www, а редирект ведёт на apex (или наоборот).
  • В кеше CDN/браузера залип старый 301 — после смены правила чистите кеш края.

Вывод

Для прямого Apache достаточно проверки %{HTTPS} и одного 301 на канонический https-хост. За прокси ориентируйтесь на X-Forwarded-Proto и не дублируйте редирект на каждом слое. В Битрикс дополнительно выровняйте настройки сайта и шаблоны ссылок — иначе .htaccess чинит только входной URL, а не все генерации внутри CMS.