PHP Получить протокол URL сайта - http против https - PullRequest
187 голосов
/ 21 декабря 2010

Я написал небольшую функцию для установки текущего протокола URL сайта, но у меня нет SSL и я не знаю, как проверить, работает ли он по протоколу https. Можете ли вы сказать мне, если это правильно?

function siteURL()
{
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $domainName = $_SERVER['HTTP_HOST'].'/';
    return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );

Нужно ли делать это, как указано выше, или я могу просто сделать это как?

function siteURL()
{
    $protocol = 'http://';
    $domainName = $_SERVER['HTTP_HOST'].'/'
    return $protocol.$domainName;
}
define( 'SITE_URL', siteURL() );

При использовании SSL сервер не преобразует автоматически URL-адрес в https, даже если URL-адрес тега привязки использует http?Нужно ли проверять протокол?

Спасибо!

Ответы [ 16 ]

83 голосов
/ 27 февраля 2013

Я знаю, что уже поздно, хотя есть гораздо более удобный способ решить эту проблему! Решения, показанные выше, довольно грязные, и если кто-то когда-нибудь обратится к этому, я бы сделал следующее:

$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === 0 ? 'https://' : 'http://';

или даже без условий, если вам не нравится

$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,strpos( $_SERVER["SERVER_PROTOCOL"],'/'))).'://';

Посмотрите на $_SERVER["SERVER_PROTOCOL"]

68 голосов
/ 21 декабря 2010

Это не автоматически. Ваша верхняя функция выглядит хорошо.

60 голосов
/ 11 января 2013

Это работает для меня

if (isset($_SERVER['HTTPS']) &&
    ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
    isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
    $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $protocol = 'https://';
}
else {
  $protocol = 'http://';
}
24 голосов
/ 11 сентября 2012

Некоторые изменения:

function siteURL() {
  $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || 
    $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $domainName = $_SERVER['HTTP_HOST'];
  return $protocol.$domainName;
}
16 голосов
/ 20 февраля 2015

короткий путь

$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
7 голосов
/ 01 октября 2014

Поскольку, по моему мнению, тестирование номера порта не является хорошей практикой, мое решение:

define('HTTPS', isset($_SERVER['HTTPS']) && filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN));

Константа HTTPS возвращает TRUE, если $_SERVER['HTTPS'] установлено и равно "1", "true", "on" или "yes". В противном случае возвращает FALSE.

6 голосов
/ 15 сентября 2016

Для любой системы, кроме IIS, этого вполне достаточно, чтобы определить собственный URL сайта:

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].'/';

или

$siteURL='http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].'/';

зависит от того, что именно вы хотите: HTTP_HOST против SERVER_NAME

4 голосов
/ 26 августа 2016

В случае прокси SERVER_PORT может не дать правильное значение, так что это то, что у меня работает -

$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://"
4 голосов
/ 08 июля 2015

Используйте эту переменную сервера, чтобы получить подробности протокола:

 $scheme = $_SERVER['REQUEST_SCHEME'] . '://';
 echo $scheme; //it gives http:// or https://

Обратите внимание, что эта переменная сервера ненадежна. Для получения дополнительной информации взгляните на: Надежен ли $ _SERVER ['REQUEST_SCHEME']?

2 голосов
/ 03 апреля 2018

Я знаю, что это старый вопрос, но я столкнулся с этим сегодня, так как мне нужно было проверить это на моем сайте. Кажется, ответы выше неоправданно сложны. Чтобы установить протокол сайта, все, что вам нужно сделать, это проверить $_SERVER['HTTPS']

Если протокол использует HTTPS, то $_SERVER['HTTPS'] вернет «вкл». Если нет, переменная останется пустой. Например: <br> // test if HTTPS is being used. If it is, the echo will return '$SSL_test: on'. If not HTTPS, '$SSL_test' will remain empty.</p> <p>$SSL_test = $_SERVER['HTTPS'];</p> <pre><code>echo '<p>$SSL_test: '.$SSL_test.'</p>'; if($SSL_test == true) { echo 'You\'re using SSL'; } else { echo 'You\'re not using SSL'; }

Вы можете использовать вышеупомянутое, чтобы легко и точно протестировать HTTPS и реализовать соответственно. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...