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!
16 réponses
Il n'est pas automatique. Votre fonction de haut semble ok.
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"]
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://';
}
Certains changements:
function siteURL() {
$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ||
$_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$domainName = $_SERVER['HTTP_HOST'];
return $protocol.$domainName;
}
voie courte
$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
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.
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
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?
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://"
$protocal = 'http';
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || $_SERVER['HTTPS'] == 'on') {$protocal = 'https';}
echo $protocal;
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. :)
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
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://';
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;
}
}
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.
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';