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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
19
0
25 561
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

Ага, хороший ответ, hayalci. Я только что изучал ту же проблему (на сайте, который, как мне кажется, также сбалансирован по нагрузке), и, похоже, единственный способ определить использование HTTPS - это использовать заголовок HTTP_NOSSL. Истина означает HTTP, ложь означает HTTPS.

Simon East 17.08.2011 06:54

Если у кого-то есть такая же проблема с 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 29.07.2012 13:13

@eipark уверен, так как заголовок установленный клиентом, но есть условный возврат.

Zaffy 29.07.2012 14:36

@elpark Пока вы не используете балансировщик нагрузки aws, я бы сказал нет, поскольку это задокументированная функция: aws.typepad.com/aws/2010/10/….

mrucci 30.07.2012 14:01

@eipark Да, когда вы находитесь между балансировщиком нагрузки и вашим сервером

kaiser 24.09.2015 20:53

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

Другие вопросы по теме