Дано: сайт на 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
Не проверялось.