Так вроде очень похоже на « Обнаружение https-запросов в php »:
Хотите, чтобы https://example.com/pog.php перешел на http://example.com/pog.php или даже наоборот.
Проблемы:
apache_request_headers()
и apache_response_headers()
отправляют обратно то же самое Есть ли на странице способы определить, вызвана ли она через 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).