Подтвердить что ты не робот

PHP Получить протокол URL сайта - http vs https

Я написал небольшую функцию для установки текущего URL-адреса 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? Нужно ли проверять протокол?

Спасибо!

4b9b3361

Ответ 1

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

Ответ 2

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

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

... или даже без условий, если вы предпочитаете:

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

Взгляните на $_SERVER["SERVER_PROTOCOL"]

Ответ 3

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

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://';
}

Ответ 4

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

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

Ответ 5

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

$scheme = $_SERVER['REQUEST_SCHEME'] . '://';

Ответ 6

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

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

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

Ответ 7

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

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

или

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

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

Ответ 8

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

$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://"

Ответ 9

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

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

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

Ответ 10

сделал функцию, используя ответ Rid Iculous, который работал в моей системе.

function site_protocol() {
    if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&  $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')  return $protocol = 'https://'; else return $protocol = 'http://';
}

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

Ответ 11

$protocal = 'http';
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || $_SERVER['HTTPS'] == 'on') {$protocal = 'https';}


echo $protocal;

Ответ 12

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

Если протокол использует HTTPS, то $_SERVER['HTTPS'] вернет 'on'. Если нет, переменная останется пустой. Например:
//test if HTTPS is being used. If it is, the echo will return '$SSL_test: on'. If not HTTPS, '$SSL_test' will remain empty.

$ SSL_test = $ _SERVER ['HTTPS'];

 echo '<p>$SSL_test: '.$SSL_test.'</p>'; if($SSL_test == true) { echo 'You\'re using SSL'; } else { echo 'You\'re not using SSL'; }

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

Ответ 13

Я тестировал самый проголосовавший answe, и он не работал у меня. Я закончил использование:

$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';

Ответ 14

Извлечено из CodeIgniter:

if ( ! function_exists('is_https'))
{
    /**
     * Is HTTPS?
     *
     * Determines if the application is accessed via an encrypted
     * (HTTPS) connection.
     *
     * @return  bool
     */
    function is_https()
    {
        if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
        {
            return TRUE;
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
        {
            return TRUE;
        }
        elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
        {
            return TRUE;
        }

        return FALSE;
    }
}

Ответ 15

это лучшее решение https или http, использующее это:

<?php
$protocol = '//';  
$site_url = $protocol.$_SERVER["HTTP_HOST"];
?>

Но не может отображать https или http, поэтому он используется только для ссылки на ваш контент сайта, например изображение и т.д.

если вы хотите перенаправить свой сайт в https, добавьте этот код в файл .htaccess:

<IfModule mod_rewrite.c>
 RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
 RewriteRule ^(.*)$ https://www.your-domain.com$1 [L]
</IfModule>

Измените www.your-domain.com на ваше имя dowmain.

Ответ 16

Вот как я это делаю... это версия сокращенного if else ответа Рида Икулеса...

$protocol = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ? 'https' : 'http';