Симуляция https (ssl) сессии средствами rewrite модуля


Многие сталкивались с балансировкой нагрузки. В этой статье хочу затронуть тему балансировки нагрузки https соединений. Затрону только поверхностно, поскольку делаю маленькую заметку.

Большинство балансировщиков нагрузки поддерживают так называемое 'ssl termination'. В этом случае клиент устанавливает защищенную сессию с балансировщиком нагрузки, на самом же балансировщике происходит ssl handshake и с него же отправляется ssl сертификат клиенту. Дальше балансровщик устанавливает сессию с самим сервером и получает с него контент. Из полученных данных формируется новый пакет и отправляется клиенту.

Кто-то знает, кто-то нет, что ssl или https соединения грузят сам сервер на много больше, чем обычные http. Казалось бы, для того, что бы снять ненужную нагрузку с сервера, можно можно бэк-эндом для ssl сессии указывать http адрес сервера в настройках балансировщика и все будет в шоколаде.

Да вот незадача: большинство cms систем, да и просто сайтов имеют проверку безопасных соединений. В случае обнаружения незащищенной сессии сайт перенаправит запрос/соединение на https. Балансировщик снова доставит его в http порт и браузер отобразит клиенту сообщение о том, что страница не может быть обработана из-за бесконечного редиректа.

Как правило php приложения проверяют наличие переменной HTTPS со значением "on" в окружении SERVER. Так же может проверяться значение SERVER_PORT. Для того что бы обмануть приложение, можно руками создать эту переменную.

Для этого открываем конфиг виртуального https хоста. Рекомендую описывать его отдельно.
Меняем значение SSLEngine c "on" на "off".

Теперь вставляем следующие строки в конфигурационный файл:

RewriteEngine on
RewriteRule .* - [E=HTTPS:on]

Если не поможет, добавьте еще вот такую строку:

RewriteRule .* - [E=SERVER_PORT:443]

Либо:

SetEnvIf X-Forwarded-Proto https HTTPS=on

Share Button
(Visited 103 times, 1 visits today)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.