Проблема, с которой я столкнулся, связана с необходимостью сохранить некоторые URL-адреса веб-сайта, защищенные HTTPS, а остальные - HTTP.
Обычно у вас есть $_SERVER['HTTP_HTTPS'] или $_SERVER['HTTPS'] (в зависимости от вашего вкуса Apache). Вы также можете проверить порт - это 80 для нормального трафика и 443 для HTTPS.
Моя проблема в том, что сертификат находится на балансировщике нагрузки и все эти переменные недоступны, а веб-сервер видит http://www.foo.com на порту 80. Один из способов исправить это - указать балансировщику нагрузки отправлять трафик на другой порт, но мне интересно, есть ли другие способы обнаружить HTTPS, исходящий от балансировщика нагрузки?






Если балансировщик нагрузки является другим концом SSL-соединения, вы не можете получить больше информации, чем явно предоставляет балансировщик нагрузки. Я бы пошел на добавление заголовка http, возможно, он уже делает это, сбросил все заголовки HTTP и посмотрел.
В качестве другого решения вы можете выполнить перенаправление на балансировщике нагрузки на основе URL-адреса.
Если у кого-то есть такая же проблема с Amazon AWS Elastic Load Balancer, решение простое, потому что переменная $_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'] не будет включен в переменную $ _SERVER?
@eipark уверен, так как заголовок установленный клиентом, но есть условный возврат.
@elpark Пока вы не используете балансировщик нагрузки aws, я бы сказал нет, поскольку это задокументированная функция: aws.typepad.com/aws/2010/10/….
@eipark Да, когда вы находитесь между балансировщиком нагрузки и вашим сервером
$ _SERVER ['HTTP_X_FORWARDED_PROTO'] кажется хорошим решением для пользователей joomla, потому что, если ваш loadbalancer выполняет перенаправление, и вы устанавливаете параметр force_ssl на 1 или 2, вы закончите бесконечный цикл, потому что joomla всегда видит http:
Ага, хороший ответ, hayalci. Я только что изучал ту же проблему (на сайте, который, как мне кажется, также сбалансирован по нагрузке), и, похоже, единственный способ определить использование HTTPS - это использовать заголовок
HTTP_NOSSL. Истина означает HTTP, ложь означает HTTPS.