web-dev-qa-db-fra.com

PHP Obtenir le protocole d'URL de site - http vs https

J'ai écrit une petite fonction pour établir le protocole d'URL actuel du site, mais je n'ai pas de protocole SSL et je ne sais pas comment vérifier s'il fonctionne sous https. Pouvez-vous me dire si cela 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 comme??

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 utilise http? Est-il nécessaire de vérifier le protocole?

Je vous remercie!

188
anon445699

Ce n'est pas automatique. Votre fonction supérieure a l'air bien.

69
profitphp

Je sais qu'il est tard, bien qu'il existe un moyen beaucoup plus pratique de résoudre ce genre de problème! Les solutions présentées ci-dessus sont assez compliquées, et si quelqu'un vérifiait cela, voici ce que je ferais:

_$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === 0 ? '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"]

84
Ivo

Ça marche 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://';
}
62
Rid Iculous

Quelques changements:

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

chemin court

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

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

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

La constante HTTPS renvoie TRUE si $_SERVER['HTTPS'] est défini et égal à "1", "vrai", "activé" ou "oui". Retourne FALSE sinon.

7
alex

Pour tout système à l'exception de IIS, cela suffit amplement pour définir l'URL autonome du site:

$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
Eugene Zakharenko

En cas de proxy, le SERVER_PORT peut ne pas donner la valeur correcte, c'est donc 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://"
5
Harshit

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

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

Notez que cette variable de serveur n'est pas fiable. Pour plus d'informations, consultez: Est-ce que $ _SERVER ['REQUEST_SCHEME'] est fiable?

4
shashik493

fait une fonction en utilisant la réponse de Rid Iculous 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

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


echo $protocal;
2

Je sais que c’est une vieille question mais j’en suis tombé aujourd’hui car j’avais besoin de tester cela sur mon site. Il semble que les réponses ci-dessus sont inutilement compliquées. Pour établir le protocole de site, il vous suffit de tester $_SERVER['HTTPS']

Si le protocole utilise HTTPS, alors $_SERVER['HTTPS'] retournera "on". Sinon, la variable restera vide. Par 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';
} 
 </ code>

Vous pouvez utiliser ce qui précède pour tester facilement et proprement HTTPS et mettre en œuvre en conséquence. :)

2
Rob Stocki

J'ai testé le le plus voté answe r et cela n'a pas fonctionné pour moi , j'ai fini par utiliser:

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

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
Guillaume

Voici comment je le fais ... c'est une version abrégéeif else version de de la réponse de de Iculous .. .

$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
Scotty G

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, il est donc uniquement utilisé pour lier le contenu de votre site comme une image, etc.

si vous voulez rediriger votre site en https, ajoutez ce code dans le fichier .htaccess:

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

Changez www.votre-domaine.fr avec votre nom dowmain.

0
Jhoel Rhocher