J'ai vu de nombreux didacticiels en ligne indiquant que vous devez vérifier $_SERVER['HTTPS']
si la connexion du serveur est sécurisée avec HTTPS. Mon problème est que sur certains des serveurs que j'utilise, il $_SERVER['HTTPS']
y a une variable non définie qui entraîne 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 s'il s'agit d'une connexion HTTPS:
if(isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == "on") {
$secure_connection = true;
}
}
Secure
cookies. Soyez prudent avec les pièges.Réponses:
Cela devrait toujours fonctionner même si
$_SERVER['HTTPS']
n'est pas défini:Le code est compatible avec IIS.
À partir de la documentation PHP.net et des commentaires des utilisateurs :
En outre, les serveurs Apache 1.x (et les installations interrompues) peuvent ne pas avoir été
$_SERVER['HTTPS']
définis, même s'ils se connectent en toute sécurité. Bien que non garantie, les connexions sur le port 443 sont, par convention , en utilisant probablement des prises sécurisées , d' où le contrôle du port supplémentaire.Remarque supplémentaire: s'il existe un équilibreur de charge entre le client et votre serveur, ce code ne teste pas la connexion entre le client et l'équilibreur de charge, mais la connexion entre l'équilibreur de charge et votre serveur. Pour tester l'ancienne connexion, vous devriez tester en utilisant l'en-
HTTP_X_FORWARDED_PROTO
tête, mais c'est beaucoup plus complexe à faire; voir les derniers commentaires ci-dessous cette réponse.la source
getservbyname()
n'est qu'une référence, pas une réalité, et ne garantit en aucun cas que HTTPS fonctionne sur le port 443.$_SERVER['SERVER_PORT'] !== 443
je devais lancer$_SERVER['SERVER_PORT]
un entier comme ceci:intval($_SERVER['SERVER_PORT]) !== 443
strtolower($_SERVER['HTTPS']) !== 'off'
fait l'affaire.Ma solution (car les conditions standard [$ _SERVER ['HTTPS'] == 'on'] ne fonctionnent pas sur les serveurs derrière un équilibreur de charge) est:
HTTP_X_FORWARDED_PROTO: un standard de facto pour identifier le protocole d'origine d'une requête HTTP, puisqu'un proxy inverse (load balancer) peut communiquer avec un serveur Web en utilisant HTTP même si la requête au proxy inverse est HTTPS http: //en.wikipedia. org / wiki / List_of_HTTP_header_fields # Common_non-standard_request_headers
la source
Chacha, selon la documentation PHP: "Défini sur une valeur non vide si le script a été interrogé via le protocole HTTPS." Donc, votre instruction if retournera false dans de nombreux cas où HTTPS est effectivement activé. Vous voudrez vérifier qu'il
$_SERVER['HTTPS']
existe et n'est pas vide. Dans les cas où HTTPS n'est pas correctement défini pour un serveur donné, vous pouvez essayer de vérifier si$_SERVER['SERVER_PORT'] == 443
.Mais notez que certains serveurs définiront également
$_SERVER['HTTPS']
sur une valeur non vide, assurez-vous donc de vérifier également cette variable.Référence: Documentation pour
$_SERVER
et$HTTP_SERVER_VARS
[obsolète]la source
HTTP_X_FORWARDED_PROTO
ouHTTP_X_FORWARDED_SSL
aussi.(((isset($_SERVER['HTTPS'])) && (strtolower($_SERVER['HTTPS']) == 'on')) || ((isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) && (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')))
qui n'inclut pas du tout le contrôle du port. N'hésitez pas à ajouter. :-)SetEnvIf X-Forwarded-SSL on HTTPS=on
fera l'affaire. Mais cela ne fonctionnera pas,REQUEST_SCHEME
car php semble préférable d'utiliser$_SERVER['HTTPS']
Cela fonctionne également lorsque
$_SERVER['HTTPS']
n'est pas définila source
$_SERVER['HTTPS']
n'est pas encore défini https est activé. Et ça?SERVER_PORT
est défini toujours qui résout le problème indéfini deHTTPS
Je viens d'avoir un problème où j'exécutais le serveur en utilisant Apache mod_ssl, mais un phpinfo () et un var_dump ($ _SERVER) ont montré que PHP pense toujours que je suis sur le port 80.
Voici ma solution de contournement pour toute personne ayant le même problème ...
La ligne à noter est la ligne SetEnv. Avec cela en place et après un redémarrage, vous devriez avoir la variable d'environnement HTTPS dont vous avez toujours rêvé
la source
Créer ma propre fonction en lisant tous les articles précédents:
la source
Si vous utilisez Apache, vous pouvez toujours compter sur
pour vérifier le schéma de l'URL demandée. Mais, comme mentionné dans d'autres réponses, il est prudent de vérifier d'autres paramètres avant de supposer que SSL est vraiment utilisé.
la source
La vraie réponse: prêt pour le copier-coller dans un script [config]
$pv_URIprotocol
est maintenant correct et prêt à être utilisé; exemple$site=$pv_URIprotocol.$_SERVER["SERVER_NAME"]
. Naturellement, la chaîne pourrait également être remplacée par TRUE et FALSE. PV signifie PortalPress Variable car il s'agit d'un copier-coller direct qui fonctionnera toujours. Cette pièce peut être utilisée dans un script de production.la source
Je ne pense pas que l'ajout d'un port soit une bonne idée - surtout lorsque vous avez de nombreux serveurs avec des versions différentes. cela ajoute juste une chose de plus à ne pas oublier pour changer. en regardant les doc, je pense que la dernière ligne de kaisers est assez bonne, de sorte que:
semble parfaitement suffisant.
la source
La seule méthode fiable est celle décrite par Igor M.
Considérez ce qui suit: Vous utilisez nginx avec fastcgi, par défaut (debian, ubuntu) la directive fastgi_params contient:
fastcgi_param HTTPS $ https;
si vous n'utilisez PAS SSL, il est traduit par une valeur vide, pas «off», pas 0 et vous êtes condamné.
http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html
la source
Je trouve ces paramètres également acceptables et plus que probablement ils n'ont pas de faux positifs lors du changement de serveur Web.
$ _SERVER ['HTTPS_SERVER_SUBJECT']
la source
Voie la plus courte que j'utilise:
Si https est utilisé, alors $ secure_connection est vrai.
la source
echo (!empty($_SERVER['HTTPS'])?'https':'http');
vous donnehttp
ouhttps
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
Vous pouvez vérifier
$_SERVER['SERVER_PORT']
que SSL fonctionne normalement sur le port 443, mais ce n'est pas infaillible.la source
Que pensez-vous de cela?
la source
Sur mon serveur (Ubuntu 14.10, Apache 2.4, php 5.5), la variable
$_SERVER['HTTPS']
n'est pas définie lorsque le script php est chargé via https. Je ne sais pas ce qui ne va pas. Mais les lignes suivantes du.htaccess
fichier résolvent ce problème:la source
Voici une fonction réutilisable que j'utilise depuis un moment. HTH.
Remarque: La valeur de HTTPS_PORT (qui est une constante personnalisée dans mon code) peut varier selon votre environnement, par exemple elle peut être 443 ou 81.
la source
juste pour l'intérêt, Chrome Canary envoie en ce moment
au serveur, et selon la façon dont le serveur est configuré peut signifier que vous récupérez les éléments suivants
Cela a cassé notre application parce que nous testions si, ce qui n'est évidemment pas le cas. Pour le moment, seul Chrome Canary semble le faire, mais il convient de noter que les objets de Canary atterrissent généralement dans le chrome "normal" peu de temps après.
la source
Si vous utilisez nginx comme système d'équilibrage de charge, vérifiez $ _SERVER ['HTTP_HTTPS'] == 1, les autres vérifications échoueront pour ssl.
la source
Le code vérifie tout ce qui est possible et fonctionne également sur le serveur Web IIS. Chrome depuis la v44 ne définit pas l'en-tête HTTP: 1, donc vérifier HTTP_HTTPS est OK. Si ce code ne correspond pas à https, cela signifie que votre serveur Web ou serveur proxy est mal configuré. Apache lui-même définit correctement l'indicateur HTTPS, mais il peut y avoir un problème lorsque vous utilisez un proxy (par exemple nginx). Vous devez définir un en-tête dans l'hôte virtuel nginx https
et utilisez un module Apache pour définir correctement l'indicateur HTTPS en recherchant X-HTTPS à partir du proxy. Recherchez mod_fakessl, mod_rpaf, etc.
la source
Si vous utilisez l'équilibreur de charge d'Incapsula, vous devrez utiliser une IRule pour générer un en-tête personnalisé pour votre serveur. J'ai créé un en-tête HTTP_X_FORWARDED_PROTO qui est égal à "http" si le port est défini sur 80 et "https" s'il est égal à 443.
la source
J'ajouterais un filtre global pour m'assurer que tout ce que je vérifie est correct;
la source
J'ai l'occasion d'aller plus loin et de déterminer si le site auquel je me connecte est compatible SSL (un projet demande à l'utilisateur son URL et nous devons vérifier qu'il a installé notre pack API sur un site http ou https).
Voici la fonction que j'utilise - en gros, appelez simplement l'URL via cURL pour voir si https fonctionne!
C'est le moyen le plus fiable que j'ai trouvé pour non seulement savoir si vous utilisez https (comme le demande la question), mais si vous POUVEZ (ou même DEVRIEZ) utiliser https.
REMARQUE: il est possible (mais pas vraiment probable ...) qu'un site puisse avoir des pages http et https différentes (donc si on vous dit d'utiliser http, peut-être que vous n'avez pas besoin de changer ..) La grande majorité des sites sont les mêmes, et devraient probablement vous rediriger eux-mêmes, mais cette vérification supplémentaire a son utilité (certainement comme je l'ai dit, dans le projet où l'utilisateur entre les informations de son site et vous voulez vous en assurer du côté serveur)
la source
C'est comme ça que je trouve résoudre ça
la source
J'ai utilisé la suggestion principale ici et je me suis ennuyé de la "notification PHP" dans les journaux lorsque HTTPS n'était pas défini. Vous pouvez l'éviter en utilisant l' opérateur de fusion nul "??":
(Remarque: non disponible avant php v7)
la source
Selon le post de hobodave: "Définissez une valeur non vide si le script a été interrogé via le protocole HTTPS."
la source
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')