Est $_SERVER['REQUEST_SCHEME'] fiable?
J'ai récemment été la recherche d'un moyen de déterminer correctement le protocole, en vertu de laquelle la demande d'url a été fourni au serveur.
J'ai regardé à travers parse_url()
et si $_SERVER
variable superglobale, et trouvé ceci:
<?php
header('Content-Type: text/plain');
print_r($_SERVER);
?>
De sortie:
[REQUEST_SCHEME] => http
Cependant, j'ai été incapable de le trouver sur php.net ou Google. Bien, j'ai été en mesure de trouver ce question. Q#1: Si $_SERVER['REQUEST_SCHEME']
n'était pas documentée, alors il est probablement peu fiables, ou il peut être digne de confiance?
Je suis en utilisant VC9 PHP 5.4.14 TS
sous windows pour le développement. Mais ma production est sous ubuntu. Q#2: Est cette propriété également disponibles sous ubuntu linux aussi?
Vous devez vous connecter pour publier un commentaire.
Il est difficile de prouver qu'il est fiable, mais il est facile de prouver qu'il n'est pas fiable (si seulement je pouvais fournir un cas qu'il ne fonctionne pas). Et je peux prouver que c'est pas fiable car il ne fonctionne pas avec IIS 7.0 + PHP 5.3
PHP 5.4.17
ne montrent pas non plus.lighttpd
avecPHP 5.5.9
.La
REQUEST_SCHEME
variable d'environnement est documenté sur le Apache mod_rewrite page. Cependant, il n'est pas devenu disponible jusqu'Apache 2.4.Je n'ai qu'Apache 2.2 et j'ai donc créé une variable d'environnement. J'ai ajouté les suivantes au début de ma .fichier htaccess.
Maintenant je peux utiliser
%{ENV:REQUEST_SCHEME}
dans d'autres réécrire les conditions et les règles$_SERVER['REQUEST_SCHEME']
dans mon code PHPJe n'ai pas à le faire très salissant conditionnelle vérifie partout, et mon code PHP est compatible. Lors de la configuration d'Apache est mis à jour, je peux changer mon .fichier htaccess.
Je ne sais pas comment vous pouvez l'appliquer à un environnement Windows. Ce n'est probablement pas une bonne solution pour la distribution de code, mais il fonctionne bien pour mes besoins.
Que cette variable n'est pas disponible dans toutes les versions de serveur, il n'est pas fiable, le test il.
Au lieu de cela, vous pouvez modifier votre code PHP pour tester deux des serveurs de plus les variables d'environnement, qui peuvent également indiquer que le https est utilisé, comme ci-dessous:
Comme le fait observer toxalot, REQUEST_SCHEME est un natif de la variable serveur web Apache depuis sa version 2.4. Apache 2.2 ne l'a pas (voir Apache 2.2 les variables de serveur) et Microsoft IIs 8.5 ne l'ont pas, soit (voir IIS 8.5 les Variables de Serveur). Naturellement, si une variable n'est pas définie par le serveur, PHP va pas les inclure dans son tableau global $_SERVER.
Heureusement, pour la compatibilité avec les codes basés exclusivement sur REQUEST_SCHEME de vérification, vous pouvez créer cette variable dans Apache 2.2 montage tous votre hôte, des fichiers de configuration (httpd.conf, ssl.conf, 000-default.conf, vhosts.conf), en ajoutant les lignes suivantes:
Le code ci-dessus suppose que l'utilisation d'un serveur virtuel pour chaque protocole (une des meilleures pratiques dans Apache - voir cette et que).
$server_request_scheme = 'http'
lorsque leREQUEST_SCHEME
variable d'environnement n'est pas définie. En outre, pour laSetEnvIf Request_Protocol
, cela ne fonctionne pas sur les serveurs virtuels à l'écoute sur les deux ports.phpinfo()
mais la valeur reste http$_SERVER['HTTPS'] == 'on'
qui peuvent être définis parproxy_set_header X-Forwarded-SSL $https;
(nginx) etSetEnvIf X-Forwarded-SSL on HTTPS=on
(apache2) et jamais, jamais utiliser totalement fiable REQUEST_SCHEMEMoi aussi, je n'arrivais pas à trouver une référence à
REQUEST_SCHEME
, mais si vous êtes à la recherche pour déterminer si une demande a été faite parhttp:
ouhttps:
ensuite, vous pouvez utiliser$_SERVER['HTTPS']
, qui est fixé à une valeur non vide si une demande a été faite parhttps:
. Il est documenté sur le PHP du site ici$_SERvER['HTTPS']
donne de la valeur non vide (off
) qui indique que le HTTPS n'a PAS été utilisé. Plus d'infos sur la page liée à la réponse.isset($_SERVER['HTTPS']) && 'on' === $_SERVER['HTTPS']
semble être le moyen le plus sûr pour déterminer https://Dans la nouvelle version de Nginx, définie par défaut
fastcgi_param REQUEST_SCHEME $scheme
.L'amélioration de toxalot de suggestion pour les utilisateurs de CloudFlare:
Cette valeur dépend de votre serveur web. Si vous utilisez nginx (v1.10), dans le fichier
/etc/nginx/fastcgi_params
vous pouvez le voir, cette lignes suivantes :Généralement, ces valeurs par défaut sont suffisantes.
Mais il est possible que cela ne fonctionne pas, vous pouvez la force de ces valeurs dans votre vhost :
Si vous utilisez Apache, vous pouvez prendre un coup d'oeil toxalot la réponse de
Son intéressant de voir comment WordPress résout ce problème avec son is_ssl() fonction qui rend l'utilisation de la variable $_SERVER variable,