php - habilitar - xampp https
Detectando HTTPS vs HTTP en el servidor devolviendo nada Ăștil (2)
$ _SERVER ["HTTPS"] no está allí, encendido o no, no importa si está viendo el sitio a través de SSL o no SSL. Por algún motivo, el servidor ha elegido atender todas las solicitudes HTTPS encriptadas, pero baje el puerto 80. Y por lo tanto, $ _SERVER ["HTTPS"] nunca está activado, no está allí, simplemente no hay comentarios útiles sobre ese punto del servidor. Entonces ese parámetro siempre estará vacío.
Debe asegurarse de que el proveedor tenga la siguiente línea en la entrada VHOST para su sitio: SSLOptions +StdEnvVars
. Esa línea le dice a Apache que incluya las variables SSL en el entorno para sus scripts (PHP).
Muy parecido a " Detectar solicitudes https en php ":
Desea que https://example.com/pog.php vaya a http://example.com/pog.php o incluso viceversa.
Problemas:
- No se puede leer nada de $ _SERVER ["HTTPS"] ya que no está allí
- El servidor está enviando ambas solicitudes por el puerto 80, por lo que no puede verificar el 443 en la versión HTTPS
-
apache_request_headers()
yapache_response_headers()
están devolviendo lo mismo - No puedo decirle nada al equilibrador de carga ni hacerle enviar algo extra
- Los datos de respuesta del servidor escupidos por la página en ambas llamadas a la URL son exactamente los mismos que para la ID de la sesión. Gorrón.
¿Hay formas en la página para detectar si se está llamando a través de SSL o no SSL?
Editar : $_SERVER["HTTPS"]
no está allí, encendido o no, no importa si está viendo el sitio a través de SSL o no SSL. Por algún motivo, el servidor ha elegido atender todas las solicitudes HTTPS encriptadas, pero baje el puerto 80. Y por lo tanto, $_SERVER["HTTPS"]
nunca está activado, no está allí, simplemente no hay comentarios útiles sobre ese punto del servidor. Entonces ese parámetro siempre estará vacío.
(Y sí, eso significa que se marca en decir FF o Chrome para un certificado SSL parcialmente inválido. Pero esa parte no importa).
Además, lo máximo que se puede obtener al detectar la URL es hasta el punto de las barras diagonales. El PHP no puede ver si la solicitud tiene https
o http
al frente.
Palabra clave - Load Balancer
El problema se reduce al hecho de que el equilibrador de carga maneja el cifrado / descifrado SSL y es completamente transparente para el servidor web.
Request: Client -> 443or80 -> loadbalancer -> 80 -> php
Response: PHP -> 80 -> loadbalancer -> 443or80 -> Client
La verdadera pregunta aquí es "¿tiene usted control sobre la configuración del equilibrador de carga?"
Si lo haces, hay un par de formas de manejarlo. Configure el equilibrador de carga para que tenga definiciones de servicio separadas para HTTP y HTTPS. A continuación, envíe el tráfico HTTP al puerto 80 de los servidores web y el tráfico HTTPS al puerto 81 de los servidores web. (el puerto 81 no es usado por otra cosa).
En apache, configure dos hosts virtuales diferentes:
<VirtualHost 1.2.3.4:80>
ServerName foo.com
SetEnv USING_HTTPS 0
...
</VirtualHost>
<VirtualHost 1.2.3.4:81>
ServerName foo.com
SetEnv USING_HTTPS 1
...
</VirtualHost>
Entonces, la variable de entorno USING_HTTPS
será 1
| 0
, según qué host virtual lo recogió. Eso estará disponible en la matriz $_SERVER
en PHP. ¿No es genial?
Si no tiene acceso a la configuración de Load Balancer , entonces las cosas son un poco más complicadas. No habrá forma de saber definitivamente si está utilizando HTTP o HTTPS, porque HTTP y HTTPS son protocolos . Especifican cómo conectarse y qué formato enviar a través de la información, pero en cualquier caso, está utilizando HTTP 1.1 para realizar la solicitud. No hay información en la solicitud real para decir si es HTTP o HTTPS.
Pero no te desanimes. Hay un par de ideas
El sexto parámetro de la función setcookie()
PHP puede indicarle a un cliente que envíe la cookie ÚNICAMENTE a través de conexiones HTTPS ( http://www.php.net/setcookie ). ¿Quizás podría establecer una cookie con este parámetro y luego verificarla en solicitudes posteriores?
Otra posibilidad sería usar JavaScript para actualizar los enlaces en cada página según el protocolo (agregando un parámetro GET).
(ninguno de los anteriores sería a prueba de balas)
Otra opción pragmática sería obtener su SSL en un dominio diferente, como secure.foo.com
. Entonces podrías recurrir al truco VirtualHost arriba.
Sé que este no es el problema más fácil porque lo trato durante el día (carga el clúster web equilibrado detrás de un equilibrador de carga Cisco CSS con módulo SSL).
Finalmente, siempre puede tener la perspectiva de que su aplicación web debe cambiar al modo SSL cuando sea necesario, y confiar en que los usuarios NO la muevan hacia atrás (después de todo, son sus datos en la línea (generalmente)).
Espero que ayude un poco.