He visto muchos tutoriales en línea que dicen que debe verificar $_SERVER['HTTPS']
si el servidor está conectado con HTTPS. Mi problema es que en algunos de los servidores que uso, $_SERVER['HTTPS']
es una variable indefinida que produce un error. ¿Hay otra variable que pueda verificar que siempre debe definirse?
Para ser claros, actualmente estoy usando este código para resolver si es una conexión HTTPS:
if(isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == "on") {
$secure_connection = true;
}
}
Secure
cookies. Pero ten cuidado con las trampas.Respuestas:
Esto siempre debería funcionar incluso cuando
$_SERVER['HTTPS']
no está definido:El código es compatible con IIS.
De la documentación de PHP.net y los comentarios de los usuarios :
Además, los servidores Apache 1.x (e instalaciones rotas) pueden no haberse
$_SERVER['HTTPS']
definido incluso si se conectan de forma segura. Aunque no está garantizado, conexiones en el puerto 443 son, por convención , probablemente utilizando conexiones seguras , por lo tanto, la comprobación de puerto adicional.Nota adicional: si hay un equilibrador de carga entre el cliente y su servidor, este código no prueba la conexión entre el cliente y el equilibrador de carga, sino la conexión entre el equilibrador de carga y su servidor. Para probar la conexión anterior, tendría que probar usando el
HTTP_X_FORWARDED_PROTO
encabezado, pero es mucho más complejo de hacer; ver los últimos comentarios debajo de esta respuesta.fuente
getservbyname()
es solo una referencia, no una realidad, y de ninguna manera garantiza que HTTPS se ejecute en el puerto 443.$_SERVER['SERVER_PORT'] !== 443
que tuve que convertir$_SERVER['SERVER_PORT]
a un número entero así:intval($_SERVER['SERVER_PORT]) !== 443
strtolower($_SERVER['HTTPS']) !== 'off'
funcionó.Mi solución (porque las condiciones estándar [$ _SERVER ['HTTPS'] == 'on'] no funcionan en servidores detrás de un equilibrador de carga) es:
HTTP_X_FORWARDED_PROTO: un estándar de facto para identificar el protocolo de origen de una solicitud HTTP, ya que un proxy inverso (equilibrador de carga) puede comunicarse con un servidor web utilizando HTTP incluso si la solicitud al proxy inverso es HTTPS http: //en.wikipedia. org / wiki / List_of_HTTP_header_fields # Common_non-standard_request_headers
fuente
Chacha, según la documentación de PHP: "Establezca un valor no vacío si el script fue consultado a través del protocolo HTTPS". Por lo tanto, su declaración if allí devolverá false en muchos casos en los que HTTPS está activado. Deberá verificar que
$_SERVER['HTTPS']
existe y que no está vacío. En los casos en que HTTPS no esté configurado correctamente para un servidor determinado, puede intentar verificar si$_SERVER['SERVER_PORT'] == 443
.Pero tenga en cuenta que algunos servidores también se establecerán
$_SERVER['HTTPS']
en un valor no vacío, así que asegúrese de verificar también esta variable.Referencia: documentación
$_SERVER
y$HTTP_SERVER_VARS
[en desuso]fuente
HTTP_X_FORWARDED_PROTO
oHTTP_X_FORWARDED_SSL
también.(((isset($_SERVER['HTTPS'])) && (strtolower($_SERVER['HTTPS']) == 'on')) || ((isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) && (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')))
que no incluye el chequeo de puerto. Siéntase libre de agregar. :-)SetEnvIf X-Forwarded-SSL on HTTPS=on
hará el truco. Pero esto no funcionaráREQUEST_SCHEME
como resultado en php parece mejor usar$_SERVER['HTTPS']
Esto también funciona cuando
$_SERVER['HTTPS']
no está definidofuente
$_SERVER['HTTPS']
aún no está definido https está habilitado. Qué hay sobre eso ?SERVER_PORT
siempre se define que resuelve el problema indefinido deHTTPS
Acabo de tener un problema en el que estaba ejecutando el servidor usando Apache mod_ssl, pero un phpinfo () y un var_dump ($ _SERVER) mostraron que PHP todavía cree que estoy en el puerto 80.
Aquí está mi solución para cualquiera con el mismo problema ...
La línea que vale la pena señalar es la línea SetEnv. Con esto en su lugar y después de un reinicio, debe tener la variable de entorno HTTPS que siempre soñó.
fuente
Haciendo mi propia función de leer todas las publicaciones anteriores:
fuente
Si está utilizando Apache, siempre puede contar con
para verificar el esquema de la URL solicitada. Pero, como se mencionó en otras respuestas, es prudente verificar otros parámetros antes de asumir que realmente se está utilizando SSL.
fuente
La respuesta REAL: listo para copiar y pegar en un script [config]
$pv_URIprotocol
ahora es correcto y está listo para ser usado; ejemplo$site=$pv_URIprotocol.$_SERVER["SERVER_NAME"]
. Naturalmente, la cadena podría reemplazarse con VERDADERO y FALSO también. PV significa PortalPress Variable, ya que es una copia y pega directa que siempre funcionará. Esta pieza se puede usar en un guión de producción.fuente
No creo que agregar un puerto sea una buena idea, especialmente cuando tienes muchos servidores con diferentes compilaciones. eso solo agrega una cosa más para recordar cambiar. mirando los documentos, creo que la última línea de kaisers es bastante buena, por lo que:
Parece lo suficientemente perfecto.
fuente
El único método confiable es el descrito por Igor M.
Considere lo siguiente: está utilizando nginx con fastcgi, por defecto (debian, ubuntu) fastgi_params contiene la directiva:
fastcgi_param HTTPS $ https;
si NO está utilizando SSL, se traduce como un valor vacío, no 'apagado', no 0 y está condenado.
http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html
fuente
Considero que estos parámetros también son aceptables y es muy probable que no tengan falsos positivos al cambiar de servidor web.
$ _SERVER ['HTTPS_SERVER_SUBJECT']
fuente
El camino más corto que estoy usando:
Si se usa https, entonces $ secure_connection es verdadero.
fuente
echo (!empty($_SERVER['HTTPS'])?'https':'http');
te dahttp
ohttps
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
Puede verificar
$_SERVER['SERVER_PORT']
que SSL normalmente se ejecuta en el puerto 443, pero esto no es infalible.fuente
¿Qué piensas de esto?
fuente
En mi servidor (Ubuntu 14.10, Apache 2.4, php 5.5) la variable
$_SERVER['HTTPS']
no se establece cuando el script php se carga a través de https. No se que esta mal. Pero las siguientes líneas en el.htaccess
archivo solucionan este problema:fuente
Aquí hay una función reutilizable que he estado usando durante un tiempo. HTH
Nota: El valor de HTTPS_PORT (que es una constante personalizada en mi código) puede variar según su entorno, por ejemplo, puede ser 443 u 81.
fuente
solo por interés, canario de cromo en este momento envía
al servidor, y dependiendo de cómo esté configurado el servidor puede significar que recupere lo siguiente
Esto rompió nuestra aplicación porque estábamos probando si estaba activado, lo que obviamente no es así. Por el momento, solo el cromo canario parece hacer esto, pero vale la pena señalar que las cosas del canario generalmente aterrizan en el cromo "normal" un poco más tarde.
fuente
Si utiliza nginx como sistema de equilibrio de carga, compruebe $ _SERVER ['HTTP_HTTPS'] == 1 otras comprobaciones fallarán para SSL.
fuente
El código está comprobando todo lo posible y funciona también en el servidor web IIS. Chrome desde v44 no establece el encabezado HTTP: 1, por lo que verificar HTTP_HTTPS está bien. Si este código no coincide con https, significa que su servidor web o servidor proxy está mal configurado. Apache mismo establece el indicador HTTPS correctamente, pero puede haber problemas cuando usa proxy (por ejemplo, nginx). Debe establecer un encabezado en el host virtual https nginx
y use algún módulo de Apache para configurar el indicador HTTPS correctamente buscando X-HTTPS desde el proxy. Busque mod_fakessl, mod_rpaf, etc.
fuente
Si está utilizando el equilibrador de carga de Incapsula, deberá usar una IRule para generar un encabezado personalizado para su servidor. Creé un encabezado HTTP_X_FORWARDED_PROTO que es igual a "http" si el puerto está configurado en 80 y "https" si es igual a 443.
fuente
Agregaría un filtro global para asegurar que todo lo que estoy verificando sea correcto;
fuente
Tengo la oportunidad de ir un paso más allá y determinar si el sitio al que me estoy conectando es compatible con SSL (un proyecto le pide al usuario su URL y debemos verificar que haya instalado nuestro paquete API en un sitio http o https).
Aquí está la función que uso: ¡básicamente, solo llame a la URL a través de cURL para ver si https funciona!
Esta es la forma más confiable que he encontrado para descubrir no solo SI está usando https (como lo indica la pregunta), sino si PUEDE (o incluso DEBERÍA) estar usando https.
NOTA: es posible (aunque no muy probable ...) que un sitio tenga páginas http y https diferentes (por lo tanto, si le dicen que use http, tal vez no necesite cambiar ...) La gran mayoría de los sitios son los mismos, y probablemente deberían redirigirlo usted mismo, pero esta verificación adicional tiene su uso (ciertamente, como dije, en el proyecto donde el usuario ingresa la información de su sitio y desea asegurarse desde el lado del servidor)
fuente
Así es como encuentro resolver esto
fuente
Utilicé la sugerencia principal aquí y me molestó el "Aviso PHP" en los registros cuando HTTPS no estaba configurado. Puede evitarlo utilizando el operador de fusión nula "??":
(Nota: no disponible antes de php v7)
fuente
Según la publicación de hobodave: "Establecer en un valor no vacío si el script fue consultado a través del protocolo HTTPS".
fuente
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')