PHP Get Site URL Protocol-http vs https

j'ai écrit une petite fonction pour établir le protocole actuel d'url du site mais je n'ai pas SSL et je ne sais pas comment tester si cela fonctionne sous https. pouvez-vous me dire si c'est correct?

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() );

Est-il nécessaire de le faire comme ci-dessus, ou puis-je le faire?:

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

sous SSL, le serveur ne convertit-il pas automatiquement l'url en https même si l'url de la balise d'ancrage est à l'aide de http? Est-il nécessaire de vérifier le protocole?

Merci!

173
demandé sur BalusC 2010-12-21 22:30:18

16 réponses

Il n'est pas automatique. Votre fonction de haut semble ok.

63
répondu profitphp 2010-12-21 19:38:31

je sais qu'il est tard, bien qu'il y ait un moyen beaucoup plus pratique de résoudre ce genre de problème! les solutions présentées ci-dessus sont assez confuses, et si quelqu'un devait revenir sur ce point, il y aurait une solution:

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

ou même sans condition si vous n'aimez pas

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

regardez $_SERVER["SERVER_PROTOCOL"]

75
répondu Ivo 2013-02-26 23:21:24

Cela fonctionne pour moi

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://';
}
58
répondu Rid Iculous 2013-01-11 01:17:38

Certains changements:

function siteURL() {
  $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || 
    $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $domainName = $_SERVER['HTTP_HOST'];
  return $protocol.$domainName;
}
25
répondu Anoop K 2014-03-29 02:46:46

voie courte

$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
16
répondu softcod.com 2015-02-20 17:37:54

parce que tester le numéro de port n'est pas une bonne pratique selon moi, ma solution est:

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

la "constante 151910920" retourne TRUE si $_SERVER['HTTPS'] est définie et égale à "1", "true", "on"ou " yes". Renvoie FALSE dans le cas contraire.

6
répondu alex 2014-10-01 15:50:34

pour n'importe quel système sauf IIS ceci est tout à fait suffisant pour définir le site AUTO URL:

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

ou

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

dépend de ce que vous voulez exactement: HTTP_HOST vs. SERVER_NAME

6
répondu Eugene Zakharenko 2017-05-23 11:55:00

utilisez cette variable du serveur pour obtenir les détails du protocole:

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

notez que cette variable du serveur n'est pas fiable. Pour plus d'informations, jetez un oeil à: Is $_SERVER ['REQUEST_SCHEME'] reliable?

4
répondu shashik493 2017-05-23 11:47:30

en cas de proxy le SERVER_PORT peut ne pas donner la valeur correcte donc c'est ce qui a fonctionné pour moi -

$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) ? "https://" : "http://"
4
répondu Harshit 2016-08-26 07:00:42
$protocal = 'http';
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || $_SERVER['HTTPS'] == 'on') {$protocal = 'https';}


echo $protocal;
2
répondu Saurabh Chandra Patel 2016-06-30 17:39:45

je sais que c'est une vieille question mais je suis tombé sur ce aujourd'hui car je devais tester pour cela dans mon site. Il semble que les réponses ci-dessus sont inutilement compliquées. Pour établir le protocole du site, tout ce que vous avez à faire est de tester $_SERVER['HTTPS']

si le protocole utilise HTTPS, alors $_SERVER['HTTPS'] retournera " on". Sinon, la variable restera vide. Exemple:

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

Vous pouvez utiliser ce qui précède pour tester facilement et proprement les HTTPS et les implémenter en conséquence. :)

2
répondu Rob Stocki 2018-04-02 23:21:35

fait une fonction en utilisant le ridiculous 'S réponse qui a fonctionné sur mon système.

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

j'Espère que ça aide

1
répondu miyuru 2014-05-10 06:28:17

j'ai testé le plus voté answe r et ne fonctionne pas pour moi , j'ai fini par utiliser:

$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
1
répondu Pedro Lobito 2017-05-23 12:02:50

extrait de 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;
    }
}
1
répondu Guillaume 2018-07-03 09:40:05

c'est la meilleure solution de https ou http utilisez ceci:

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

mais ne peut pas afficher https ou http, de sorte qu'il n'utilise que pour lier le contenu de votre site comme image, etc.

si vous souhaitez rediriger votre site en https, ajoutez ce code in .fichier htaccess:

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

changement www.your-domain.com avec votre nom d'emprunt.

0
répondu Jhoel Rhocher 2017-05-18 16:15:45

Voici comment je fais ... c'est une raccourci if else version de Rid Iculous réponse ...

$protocol = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ? 'https' : 'http';
0
répondu Scotty G 2017-11-14 17:54:54