Проблема, с которой я столкнулась, связана с необходимостью хранить некоторые URL-адреса веб-сайта, защищенного HTTPS, а остальное – для HTTP.
Обычно у вас есть $_SERVER['HTTP_HTTPS']
или $_SERVER['HTTPS']
(в зависимости от вашего вкуса Apache). Вы также можете проверить порт – это 80 для обычного трафика и 443 для HTTPS.
Моя проблема заключается в том, что сертификат находится на loadbalancer , и все эти переменные недоступны, и веб-сервер видит http://www.foo.com на порту 80. Один из способов исправить это – сказать, что loadbalancer отправляет трафик на другой порт, но мне интересно, есть ли другие способы обнаружения HTTPS, исходящие из балансировки нагрузки?
Если балансировщик нагрузки является другим концом SSL-соединения, вы не можете получить больше информации, чем явно предоставляет балансировка нагрузки. Я хотел бы добавить http-заголовок, возможно, он уже делает это, выгружает все заголовки HTTP и просматривает.
В качестве другого решения вы можете перенаправить на балансировщик нагрузки на основе URL.
Если у кого-то есть такая же проблема за балансировщиком эластичных нагрузок 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"; }
$ _SERVER ['HTTP_X_FORWARDED_PROTO'], по-видимому, является хорошим решением для пользователей joomla, потому что если ваш loadbalancer выполняет перенаправление и вы устанавливаете параметр force_ssl равным 1 или 2, вы закончите бесконечный цикл, потому что joomla всегда видит http: