LocalRedirect, https и 1С-Битрикс

Вы установили SSL-сертификат, настроили 301 редирект с HTTP на HTTPS, и сайт, кажется, работает. Но потом вы замечаете странное поведение: после авторизации, отправки формы или другого действия, которое использует внутреннюю переадресацию в 1С-Битрикс, браузер уходит в бесконечный цикл редиректов (ERR_TOO_MANY_REDIRECTS) или вас перебрасывает обратно на небезопасную HTTP-версию страницы.

Эта распространенная проблема возникает из-за того, что ваш веб-сервер настроен не до конца корректно. Давайте разберемся, почему это происходит и как это исправить.

В чем суть проблемы?

Чаще всего такая ситуация возникает, когда ваш сервер работает в связке Nginx + Apache или когда SSL-сертификат терминируется на уровне балансировщика нагрузки.

Схема выглядит так:

  1. Пользователь заходит на klondaik-studio
  2. Nginx (или балансировщик) принимает этот HTTPS-запрос.
  3. Далее Nginx обращается к Apache (где выполняется PHP-скрипт Битрикса) уже по внутреннему, незащищенному HTTP-протоколу.

В итоге, с точки зрения PHP и Битрикса, сайт работает по HTTP. Системные переменные сервера выглядят так:

  • $_SERVER['HTTPS']
    — не существует или равен off
  • $_SERVER['SERVER_PORT'] — равен 80

Когда Битрикс вызывает функцию LocalRedirect(), он видит, что протокол небезопасный, и пытается перенаправить пользователя на http://, после чего Nginx снова перехватывает запрос и отправляет на https.. — так и возникает цикл.

Решение №1 (Самое правильное): Настройка веб-сервера

Лучшее решение — "сообщить" бэкенду (Apache/PHP), что изначальное соединение от клиента было защищенным. Это делается передачей специальных заголовков от фронтенда (Nginx).

Для Nginx

Если Nginx используется как прокси-сервер, добавьте в его конфигурацию в блок location следующие директивы:

location / {
    proxy_pass http://127.0.0.1:8080; # Адрес вашего Apache/PHP-FPM
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    # Вот эти две строки решают нашу проблему
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;
}

Заголовок X-Forwarded-Proto — это стандартный способ сообщить бэкенду, по какому протоколу (http или https) пришел запрос от клиента.

Для Apache

Если вы не можете редактировать конфиг Nginx, но можете настроить Apache, добавьте в .htaccess или в конфигурацию виртуального хоста:

SetEnvIf X-Forwarded-Proto "https" HTTPS=on

Эта директива говорит Apache: "Если пришел заголовок X-Forwarded-Proto со значением https, установи серверную переменную HTTPS в состояние on".

Решение №2 (Хорошая практика): Настройка .settings.php в Битрикс

Если у вас нет доступа к конфигурации веб-сервера, можно решить проблему на уровне самого Битрикса. Для этого предназначен файл /bitrix/.settings.php. Добавьте в него следующий ключ https, который принудительно укажет фреймворку, что сайт работает по HTTPS.

<?php

return [
  // ... другие ваши настройки ...

  'https' => [
    'value' => [
      'SERVER' => [
        'HTTPS' => 'on',
      ],
    ],
    'readonly' => true,
  ],

  // ... другие ваши настройки ...
];

Это правильное и безопасное место для подобных настроек в рамках фреймворка.

Решение №3 (Устаревший «хак»): Правка dbconn.php

Этот способ был описан в оригинальной статье и часто встречается на старых форумах. Он заключается в том, чтобы "насильно" переопределить серверную переменную прямо в файле подключения к базе данных.

Для этого в файл /bitrix/php_interface/dbconn.php добавляется строка:

$_SERVER["SERVER_PORT"] = "443";

Почему этот способ плохой и не рекомендуется:

  • Скрытая логика: dbconn.php предназначен для настроек базы данных. Размещая там логику обработки протокола, вы создаете "магию", которую будет сложно найти и отладить в будущем.
  • Нарушение принципов: Это решает симптом, а не причину. Другие скрипты или системы на сайте все еще могут неверно определять протокол.
  • Риск перезаписи: Этот файл может быть изменен при обновлениях или пропущен при миграции сайта.

Использовать этот метод стоит только в самом крайнем случае, когда ни один из двух предыдущих способов по каким-то причинам недоступен.

Заключение

Проблема с бесконечным редиректом после перехода на HTTPS — это классическая ошибка конфигурации связки прокси-сервера и бэкенда.

Всегда старайтесь решать ее на самом высоком уровне, который вам доступен:

  1. Идеально: Настройка Nginx (proxy_set_header).
  2. Хорошо: Настройка .settings.php в Битриксе.
  3. На крайний случай: Правка dbconn.php.

Правильная настройка обеспечит стабильную и предсказуемую работу вашего сайта.

Оставить комментарий