LocalRedirect, https и 1С-Битрикс
Вы установили SSL-сертификат, настроили 301 редирект с HTTP на HTTPS, и сайт, кажется, работает. Но потом вы замечаете странное поведение: после авторизации, отправки формы или другого действия, которое использует внутреннюю переадресацию в 1С-Битрикс, браузер уходит в бесконечный цикл редиректов (ERR_TOO_MANY_REDIRECTS) или вас перебрасывает обратно на небезопасную HTTP-версию страницы.
Эта распространенная проблема возникает из-за того, что ваш веб-сервер настроен не до конца корректно. Давайте разберемся, почему это происходит и как это исправить.
В чем суть проблемы?
Чаще всего такая ситуация возникает, когда ваш сервер работает в связке Nginx + Apache или когда SSL-сертификат терминируется на уровне балансировщика нагрузки.
Схема выглядит так:
- Пользователь заходит на klondaik-studio
- Nginx (или балансировщик) принимает этот HTTPS-запрос.
- Далее Nginx обращается к Apache (где выполняется PHP-скрипт Битрикса) уже по внутреннему, незащищенному HTTP-протоколу.
В итоге, с точки зрения PHP и Битрикса, сайт работает по HTTP. Системные переменные сервера выглядят так:
-
— не существует или равен off$_SERVER['HTTPS']
-
$_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 — это классическая ошибка конфигурации связки прокси-сервера и бэкенда.
Всегда старайтесь решать ее на самом высоком уровне, который вам доступен:
- Идеально: Настройка Nginx (proxy_set_header).
- Хорошо: Настройка .settings.php в Битриксе.
- На крайний случай: Правка dbconn.php.
Правильная настройка обеспечит стабильную и предсказуемую работу вашего сайта.
Оставить комментарий