Подтвердить что ты не робот

Обнаружение HTTPS-запросов в PHP

Проблема, с которой я столкнулась, связана с необходимостью сохранить некоторые URL-адреса веб-сайта, защищенного HTTPS, а остальные - для HTTP.

Обычно у вас есть $_SERVER['HTTP_HTTPS'] или $_SERVER['HTTPS'] (в зависимости от вашего вкуса Apache). Вы также можете проверить порт - это 80 для обычного трафика и 443 для HTTPS.

Моя проблема заключается в том, что сертификат находится на loadbalancer, и все эти переменные недоступны, и веб-сервер видит http://www.foo.com на порту 80. Один из способов исправить это - сказать, что loadbalancer отправляет трафик на другой порт, но мне интересно, существуют ли другие способы обнаружения HTTPS, исходящие из балансировки нагрузки?

4b9b3361

Ответ 1

Если балансировщик нагрузки является другим концом SSL-соединения, вы не можете получить больше информации, чем явно предоставляет балансировка нагрузки. Я хотел бы добавить http-заголовок, возможно, он уже делает это, выгружает все заголовки HTTP и смотрит.

В качестве другого решения вы можете перенаправить на балансировщик нагрузки на основе URL.

Ответ 2

Если у кого-то есть такая же проблема за балансировщиком эластичных нагрузок Amazon AWS, решение прост, потому что переменная $_SERVER будет включать:

[HTTP_X_FORWARDED_PORT] => 443
[HTTP_X_FORWARDED_PROTO] => https

Итак, чтобы получить протокол, вы можете использовать:

function getRequestProtocol() {
    if(!empty($_SERVER['HTTP_X_FORWARDED_PROTO']))
        return $_SERVER['HTTP_X_FORWARDED_PROTO'];
    else 
        return !empty($_SERVER['HTTPS']) ? "https" : "http";
}

Ответ 3

$_SERVER ['HTTP_X_FORWARDED_PROTO'] кажется хорошим решением для пользователей joomla, потому что если ваш loadbalancer выполняет перенаправление и вы устанавливаете параметр force_ssl равным 1 или 2, то вы закончите бесконечный цикл, потому что joomla всегда видит http: