209 votes

Comment savoir si vous utilisez HTTPS sans $ _SERVER ['HTTPS']

J'ai vu de nombreux tutoriels en ligne qui disent que vous devez vérifier $ _SERVER ["HTTPS"] si le serveur est connecté à HTTPS. Mon problème est que sur certains des serveurs que j'utilise, $ _SERVER ["HTTPS"] est une variable indéfinie qui génère une erreur. Y a-t-il une autre variable que je peux vérifier et qui devrait toujours être définie?

Pour être clair, j'utilise actuellement ce code pour résoudre le problème s'il s'agit d'une connexion HTTPS:

 if(isset($_SERVER['HTTPS']))
{
    if ($_SERVER["HTTPS"] == "on") 
    {
        $secure_connection = true;
    }
}
 

307voto

Double Gras Points 2304

Cela devrait toujours fonctionner même lorsque $_SERVER['HTTPS'] n'est pas défini:

function isSecure() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}

Le code est compatible avec IIS.

À partir de la PHP.net la documentation et les commentaires de l'utilisateur :

1) Réglé à une valeur non vide si le script a été interrogé par le protocole HTTPS.

2) Notez que lors de l'utilisation avec IIS ISAPI, la valeur sera "off" si la demande n'a pas été faite via le protocole HTTPS. (Même comportement a été signalé pour IIS7 l'exécution de PHP comme un Fast-CGI application).

Aussi, Apache 1.les serveurs x (et cassé des installations) peut ne pas disposer $_SERVER['HTTPS'] définies, même si la connexion sécurisée. Bien que non garanti, les connexions sur le port 443 sont, par convention, probablement à l'aide de sockets sécurisés, d'où le port de la vérifier.

134voto

temuraru Points 381

Ma solution (parce que les conditions standard [$_SERVER['HTTPS'] == 'on'] ne fonctionne pas sur les serveurs derrière un répartiteur de charge) est de:

$isSecure = false;
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
    $isSecure = true;
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || !empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') {
    $isSecure = true;
}
$REQUEST_PROTOCOL = $isSecure ? 'https' : 'http';

HTTP_X_FORWARDED_PROTO: une de facto standard pour l'identification de l'origine d'protocole d'une requête HTTP, depuis un reverse proxy (équilibrage de charge) peut communiquer avec un serveur web à l'aide de HTTP, même si la demande pour le reverse proxy HTTPS http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Common_non-standard_request_headers

84voto

hobodave Points 14566

Chacha, par la documentation PHP: "Réglé à une valeur non vide si le script a été interrogé par le protocole HTTPS." Donc, si votre déclaration, il y retournera false dans de nombreux cas où HTTPS est en effet sur. Vous aurez envie de vérifier que $_SERVER["HTTPS"] existe et est non vide. Dans les cas où HTTPS n'est pas réglé correctement pour un serveur donné, vous pouvez essayer de vérifier si $_SERVER['SERVER_PORT'] == '443'.

Mais notez que certains serveurs seront également mis en $_SERVER['HTTPS'] à une valeur non vide, alors assurez-vous de vérifier cette variable également.

Référence: Documentation pour $_SERVER et `$HTTP_SERVER_VARS [obsolète]

11voto

tomwrong Points 2351

Je viens d'avoir un problème où j'exécutais le serveur avec Apache mod_ssl, mais un phpinfo () et un var_dump ($ _SERVER) ont montré que PHP pensait toujours que j'étais sur le port 80.

Voici ma solution de contournement pour toute personne ayant le même problème ....

 <VirtualHost *:443>
  SetEnv HTTPS on
  DocumentRoot /var/www/vhost/scratch/content
  ServerName scratch.example.com
</VirtualHost>
 

La ligne à noter est la ligne SetEnv. Avec ceci en place et après un redémarrage, vous devriez avoir la variable d'environnement HTTPS dont vous avez toujours rêvé

5voto

La VRAIE réponse: prêt à copier-coller dans un [config] script

/* les paramètres de configuration; X=éditer le 10 mai '11 */
$pv_sslport=443; /* il pourrait être différent, comme aussi Gabriel Sosa a déclaré */
$pv_serverport=80; /* X */
$pv_servername="mysite.com"; /* X */

/* X ajouté après correction par Michael Kopinsky */
if(!isset($_SERVER["SERVER_NAME"]) || !$_SERVER["SERVER_NAME"]) {
 if(!isset($_ENV["SERVER_NAME"])) {
la fonction getenv("SERVER_NAME");
 // Mettre à env server_name
$_SERVER["SERVER_NAME"]=$_ENV["SERVER_NAME"];
}
}
if(!$_SERVER["SERVER_NAME"]) (
 /* X serveur de nom est toujours vide? ... vous pouvez définir la variable $_SERVER["SERVER_NAME"]=$pv_servername; */
}

if(!isset($_SERVER["SERVER_PORT"]) || !$_SERVER["SERVER_PORT"]) {
 if(!isset($_ENV["SERVER_PORT"])) {
la fonction getenv("SERVER_PORT");
$_SERVER["SERVER_PORT"]=$_ENV["SERVER_PORT"];
}
}
if(!$_SERVER["SERVER_PORT"]) (
 /* Serveur X port toujours vide? ... vous pouvez définir la variable $_SERVER["SERVER_PORT"]=$pv_serverport; */
}

$pv_URIprotocol = isset($_SERVER["HTTPS"]) ? (($_SERVER["HTTPS"]==="" | | $_SERVER["HTTPS"]===1 || $_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://") : (($_SERVER["SERVER_PORT"]===$pv_sslport) ? "https://" : "http://");

$pv_URIprotocol est maintenant correcte et prêt à être utilisé; par exemple $site=$pv_URIprotocol.$_SERVER["SERVER_NAME"]. Naturellement, la chaîne pourrait être remplacé par le VRAI et le FAUX également. PV représente PortalPress Variable, car il est directement copier-coller qui fonctionnera toujours. Cette pièce peut être utilisé dans une production de script.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X