Я видел много онлайн-уроков, в которых говорится, что вам нужно проверить, защищено $_SERVER['HTTPS']
ли соединение с сервером по протоколу HTTPS. Моя проблема в том, что на некоторых серверах, которые я использую, $_SERVER['HTTPS']
это неопределенная переменная, которая приводит к ошибке. Могу ли я проверить еще одну переменную, которая всегда должна быть определена?
Просто чтобы быть ясно, я в настоящее время использую этот код, чтобы решить, если это соединение HTTPS:
if(isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == "on") {
$secure_connection = true;
}
}
Secure
куки. Будьте осторожны с ошибками, хотя.Ответы:
Это всегда должно работать, даже когда
$_SERVER['HTTPS']
не определено:Код совместим с IIS.
Из документации по PHP.net и комментариев пользователей :
Кроме того, серверы Apache 1.x (и неработающие установки) могут не
$_SERVER['HTTPS']
определиться даже при безопасном подключении. Хотя это и не гарантировано, соединения через порт 443, по соглашению , скорее всего, используют безопасные сокеты , следовательно, дополнительная проверка порта.Дополнительное примечание: если есть балансировщик нагрузки между клиентом и вашим сервером, этот код проверяет не соединение между клиентом и балансировщиком нагрузки, а соединение между балансировщиком нагрузки и вашим сервером. Чтобы протестировать предыдущее соединение, вы должны будете проверить, используя
HTTP_X_FORWARDED_PROTO
заголовок, но сделать это гораздо сложнее; см последние комментарии ниже этого ответа.источник
getservbyname()
это только ссылка, а не реальность, и никоим образом не гарантирует, что HTTPS работает через порт 443.$_SERVER['SERVER_PORT'] !== 443
я должен был привести$_SERVER['SERVER_PORT]
к целому числу вот так:intval($_SERVER['SERVER_PORT]) !== 443
strtolower($_SERVER['HTTPS']) !== 'off'
сделал свое дело.Мое решение (потому что стандартные условия [$ _SERVER ['HTTPS'] == 'on'] не работают на серверах за балансировщиком нагрузки):
HTTP_X_FORWARDED_PROTO: стандарт де-факто для идентификации исходного протокола HTTP-запроса, поскольку обратный прокси-сервер (балансировщик нагрузки) может обмениваться данными с веб-сервером, используя HTTP, даже если запрос обратного прокси-сервера - HTTPS http: //en.wikipedia. орг / вики / List_of_HTTP_header_fields # Common_non-standard_request_headers
источник
Чача, согласно документации PHP: «Установите непустое значение, если скрипт запрашивался по протоколу HTTPS». Так что ваш оператор if во многих случаях вернет false, если HTTPS действительно включен. Вы хотите проверить, что
$_SERVER['HTTPS']
существует и не является пустым. В случаях, когда HTTPS не установлен правильно для данного сервера, вы можете попробовать проверить, если$_SERVER['SERVER_PORT'] == 443
.Но обратите внимание, что на некоторых серверах также устанавливается
$_SERVER['HTTPS']
непустое значение, поэтому обязательно проверьте и эту переменную.Ссылка: Документация
$_SERVER
и$HTTP_SERVER_VARS
[устарела]источник
HTTP_X_FORWARDED_PROTO
илиHTTP_X_FORWARDED_SSL
также.(((isset($_SERVER['HTTPS'])) && (strtolower($_SERVER['HTTPS']) == 'on')) || ((isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) && (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')))
вообще не включает проверку порта. Не стесняйтесь добавлять. :-)SetEnvIf X-Forwarded-SSL on HTTPS=on
сделает свое дело. Но это не сработает,REQUEST_SCHEME
поэтому PHP лучше использовать$_SERVER['HTTPS']
Это также работает, когда
$_SERVER['HTTPS']
не определеноисточник
$_SERVER['HTTPS']
еще не определен https. Как насчет этого ?SERVER_PORT
определяется всегда, что решает неопределенную проблемуHTTPS
У меня только что была проблема, когда я запускал сервер, используя Apache mod_ssl, но phpinfo () и var_dump ($ _SERVER) показали, что PHP все еще думает, что я на порте 80.
Вот мой обходной путь для любого с той же проблемой ....
Стоит отметить строку SetEnv. С этим на месте и после перезапуска у вас должна быть переменная окружения HTTPS, о которой вы всегда мечтали
источник
Создание моей собственной функции от чтения всех предыдущих сообщений:
источник
Если вы используете Apache, вы всегда можете рассчитывать на
проверить схему запрошенного URL. Но, как упоминалось в других ответах, целесообразно проверить другие параметры, прежде чем предполагать, что SSL действительно используется.
источник
РЕАЛЬНЫЙ ответ: готов для копирования-вставки в скрипт [config]
$pv_URIprotocol
теперь правильно и готово к использованию; пример$site=$pv_URIprotocol.$_SERVER["SERVER_NAME"]
. Естественно, строку можно также заменить на TRUE и FALSE. PV означает переменную PortalPress, так как это прямая копия-вставка, которая всегда будет работать. Эта часть может быть использована в производственном сценарии.источник
Я не думаю, что добавление порта - это хорошая идея, особенно если у вас много серверов с разными сборками. это просто добавляет еще одну вещь, которую нужно помнить, чтобы изменить. глядя на документацию, я думаю, что последняя строка кайзеров довольно хороша, так что:
кажется достаточно идеально
источник
Единственный надежный метод - тот, который описал Игорь М.
Рассмотрим следующее: вы используете nginx с fastcgi, по умолчанию (debian, ubuntu) fastgi_params содержат директиву:
fastcgi_param HTTPS $ https;
если вы НЕ используете SSL, он переводится как пустое значение, а не «выкл», не 0, и вы обречены.
http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html
источник
Я считаю, что эти параметры также приемлемы и, скорее всего, не имеют ложных срабатываний при переключении веб-серверов.
$ _SERVER [ 'HTTPS_SERVER_SUBJECT']
источник
Кратчайший путь, которым я пользуюсь:
Если используется https, то $ secure_connection имеет значение true.
источник
echo (!empty($_SERVER['HTTPS'])?'https':'http');
дает вамhttp
илиhttps
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
Вы можете проверить,
$_SERVER['SERVER_PORT']
как SSL обычно работает на порту 443, но это не является надежным.источник
Что ты думаешь об этом?
источник
На моем сервере (Ubuntu 14.10, Apache 2.4, php 5.5) переменная
$_SERVER['HTTPS']
не устанавливается, когда скрипт php загружается через https. Я не знаю, что не так. Но следующие строки в.htaccess
файле решают эту проблему:источник
Вот функция многократного использования, которую я использовал некоторое время. НТН.
Примечание. Значение HTTPS_PORT (которое в моем коде является пользовательской константой) может варьироваться в зависимости от вашего состояния, например, оно может составлять 443 или 81.
источник
просто ради интереса, канарейка в данный момент отправляет
к серверу, и в зависимости от того, как настроен сервер, это может означать, что вы получите следующее
Это сломало наше приложение, потому что мы тестировали его, что явно не так. На данный момент, похоже, это делает только хромовая канарейка, но стоит отметить, что вещи из канарейки обычно попадают в «нормальный» хром через некоторое время.
источник
Если вы используете nginx в качестве системы балансировки нагрузки, проверьте $ _SERVER ['HTTP_HTTPS'] == 1, другие проверки не пройдут для ssl.
источник
Код проверяет все возможное и работает также на веб-сервере IIS. Chrome начиная с версии 44 не устанавливает заголовок HTTP: 1, поэтому проверка HTTP_HTTPS в порядке. Если этот код не соответствует https, это означает, что ваш веб-сервер или прокси-сервер плохо настроены. Apache сам устанавливает флаг HTTPS правильно, но могут возникнуть проблемы при использовании прокси (например, nginx). Вы должны установить заголовок в виртуальном хосте nginx https
и использовать модуль Apache для правильной установки флага HTTPS, ища X-HTTPS от прокси. Поиск mod_fakessl, mod_rpaf и т. Д.
источник
Если вы используете балансировщик нагрузки Incapsula, вам нужно использовать IRule для создания настраиваемого заголовка для вашего сервера. Я создал заголовок HTTP_X_FORWARDED_PROTO, который равен либо «http», если порт установлен на 80, и «https», если он равен 443.
источник
Я бы добавил глобальный фильтр, чтобы убедиться, что все, что я проверяю, верно;
источник
У меня есть повод пойти еще дальше и определить, поддерживает ли сайт, к которому я подключаюсь, SSL (один проект запрашивает у пользователя его URL, и мы должны убедиться, что он установил наш пакет API на сайте http или https).
Вот функция, которую я использую - в основном, просто вызовите URL через cURL, чтобы увидеть, работает ли https!
Это самый надежный способ, который я нашел, чтобы не только узнать, используете ли вы https (как задает вопрос), но и если вы МОЖЕТЕ (или даже ДОЛЖНЫ) использовать https.
ПРИМЕЧАНИЕ: возможно (хотя и не очень вероятно ...), что сайт может иметь разные страницы http и https (поэтому, если вам говорят, что вы должны использовать http, возможно, вам не нужно менять ..) Подавляющее большинство сайтов такие же, и, вероятно, должны перенаправить вас сами, но эта дополнительная проверка имеет свое применение (конечно, как я уже сказал, в проекте, где пользователь вводит информацию о своем сайте, и вы хотите убедиться на стороне сервера)
источник
Вот как я решаю это
источник
Я использовал основное предложение здесь и раздражался из-за «Уведомления PHP» в журналах, когда HTTPS не был установлен. Вы можете избежать этого, используя объединяющий нуль оператор "??":
(Примечание: недоступно до php v7)
источник
Согласно посту hobodave: «Установите непустое значение, если скрипт запрашивался по протоколу HTTPS».
источник
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')