Обнаружение HTTPS vs HTTP на сервере, отправив обратно ничего полезного

Так вроде очень похоже на « Обнаружение https-запросов в php »:

Хотите, чтобы https://example.com/pog.php перешел на http://example.com/pog.php или даже наоборот.

Проблемы:

  • Не могу прочитать ничего из $ _SERVER ["HTTPS"], так как его нет
  • Сервер отправляет оба запроса по порту 80, поэтому не может проверить на 443 версию HTTPS
  • apache_request_headers() и apache_response_headers() отправляют обратно то же самое
  • Не могу сказать, что такое loadbalancer, или послать лишние вещи
  • Данные обратной связи сервера, вырванные страницей по обоим URL-адресам, точно совпадают, за исключением идентификатора сеанса. Облом.

Есть ли на странице способы определить, вызвана ли она через SSL или без SSL?

Изменить : $_SERVER["HTTPS"] не существует, включен или нет, независимо от того, просматриваете ли вы сайт через SSL или без SSL. По какой-то причине хостинг решил обслуживать все HTTPS-запросы, зашифрованные, но вниз порт 80. И, таким образом, $_SERVER["HTTPS"] никогда не включен, а не там, просто нет никакой полезной обратной связи на этой серверной точке. Таким образом, этот параметр всегда будет пустым.

(И да, это означает, что он получает флаг в FF или Chrome за частично недействительный SSL-сертификат. Но эта часть не имеет значения.)

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

Ключевое слово – балансировка нагрузки

Проблема сводится к тому, что балансировщик нагрузки обрабатывает шифрование / дешифрование SSL и полностью прозрачен для веб-сервера.

 Request: Client -> 443or80 -> loadbalancer -> 80 -> php Response: PHP -> 80 -> loadbalancer -> 443or80 -> Client 

Реальный вопрос здесь: «У вас есть контроль над конфигурацией балансировки нагрузки?»


Если вы это сделаете, есть несколько способов справиться с этим. Настройте балансировщик нагрузки, чтобы иметь отдельные определения служб для HTTP и HTTPS. Затем отправьте HTTP-трафик на порт 80 веб-серверов и HTTPS-трафик на порт 81 веб-серверов. (порт 81 не используется ничем другим).

В apache настройте два разных виртуальных хоста:

 <VirtualHost 1.2.3.4:80> ServerName foo.com SetEnv USING_HTTPS 0 ... </VirtualHost> <VirtualHost 1.2.3.4:81> ServerName foo.com SetEnv USING_HTTPS 1 ... </VirtualHost> 

Затем переменная среды USING_HTTPS будет либо 1 | 0 , в зависимости от того, какой виртуальный хост взял его. Это будет доступно в массиве $_SERVER в PHP. Разве это не круто?


Если у вас нет доступа к конфигурации балансировки нагрузки , все будет немного сложнее. Не будет способа окончательно узнать, используете ли вы HTTP или HTTPS, поскольку протоколы HTTP и HTTPS являются протоколами . Они указывают, как подключиться и какой формат отправлять информацию, но в любом случае вы используете HTTP 1.1 для выполнения запроса. В фактическом запросе нет информации, если это HTTP или HTTPS.

Но не унывайте. Есть пара идей.

6-й параметр функции setcookie() PHP может дать указание клиенту отправлять cookie ТОЛЬКО через соединения HTTPS ( http://www.php.net/setcookie ). Возможно, вы можете установить cookie с этим параметром, а затем проверить его на последующих запросах?

Другая возможность – использовать JavaScript для обновления ссылок на каждой странице в зависимости от протокола (добавление параметра GET).

(ни одно из указанных выше не было бы доказательством пули)

Другим прагматичным вариантом было бы получить ваш SSL в другом домене, таком как secure.foo.com . Тогда вы можете прибегнуть к трюку VirtualHost выше.


Я знаю, что это не самый простой вопрос, потому что я занимаюсь этим в течение дня (балансировка нагрузки веб-кластера за балансировщиком нагрузки Cisco CSS с модулем SSL).

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

Надеюсь, это поможет.

$ _SERVER ["HTTPS"] не существует, включен или нет, независимо от того, просматриваете ли вы сайт через SSL или без SSL. По какой-то причине хостинг решил обслуживать все HTTPS-запросы, зашифрованные, но вниз порт 80. И, таким образом, $ _SERVER ["HTTPS"] никогда не включен, а не там, просто нет никакой полезной обратной связи на этой серверной точке. Таким образом, этот параметр всегда будет пустым.

Вы должны убедиться, что у поставщика есть следующая строка в записи VHOST для вашего сайта: SSLOptions +StdEnvVars . В этой строке Apache включает в себя переменные SSL в среде для ваших скриптов (PHP).