За життя

Bitrix и SSL

Прикрутил к сайту, использующему продукт Bitrix: Управление Сайтом, правильную работу через HTTPS.

Дано: сайт на Apache + nginx, SSL сертификат.

Требуется: сделать так, чтобы логин и доступ к некоторым секциям сайта происходили только по HTTPS.

Решение:

1. При использовании nginx, по крайней мере так, как нам его настроил хостер, HTTPS запросы обрабатывает сам nginx, который посылает запросы апачу по обычному соединению (чтобы не плодить ненужных сущностей). Поэтому у сервера не будет определена $_SERVER["HTTPS"]. Решением является прописать в nginx.conf, в секцию, посвященную SSL'у, строки "proxy_set_header X-HTTPS 'on'; " . Этот кастомный заголовок потом увидит скрипт, приведенный ниже.

Если у вас нету nginx'а, а SSL запросы обрабатывает апач, то вышеприведенное не нужно, а нижеследубщий скрипт нужно будет изменить.

2. В /bitrix/php_interface/init.php прописываем

AddEventHandler("main", "OnBeforeProlog", "OnBeforePrologHandler", 10, $_SERVER['DOCUMENT_ROOT'].'/my_scripts/check_ssl.php');

3. В check_ssl.php пишем (обязательно читайте комментарий ниже!!!)


function OnBeforePrologHandler(&$arFields)
{
if(defined("NEED_AUTH") && NEED_AUTH)
{
if ($_SERVER["HTTP_X_HTTPS"] != "on")
{
$link="https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
if ($_SERVER["QUERY_STRING"] != "")
$link = $link . "?" . $_SERVER["QUERY_STRING"];
LocalRedirect($link);
}
}
}
?>

Комментарий: переменная HTTP_X_HTTPS устанавливается как описано в шаге 1. Если у вас Апач честно ставит переменную $_SERVER["HTTPS"], то вы должны анализировать ее.

4. В нужных местах в коде страниц перед включением пролога пишете define("NEED_AUTH", true);

5. Следующий этап необходим, если у вас есть сторонние скрипты, которые проверяют HTTPS через $_SERVER["HTTPS"], а у вас nginx, как описано в шаге 1.
В httpd.conf или в аналогичный файл настроек apache'а пишем строку

php_value auto_prepend_file /path/to/prefix_file.php

А в prefix_file.php пишем

if ($_SERVER["HTP_X_HTTPS"] == "on")
$_SERVER["HTTPS"] = "on";
?>

Этот префиксный файл будет исполняться перед всеми PHP скриптами, и будет устанавливать $_SERVER["HTTPS"]


После данных изменений вход на страницы, в которых требуется авторизация, будет всегда производиться через HTTPS.

UPD: хостер написал еще такой вариант:

nginx передает заголовок X-HTTPS=on
В apache в нужном сайте (eldos.com) добавь

>--------------- код -------------------
SetEnvIf SSL SSL HTTPS=on
>---------------------------------------

Это скажет php, что делать с SSL


Не проверялось.