Redirigir de HTTP a HTTPS con PHP

107

Estoy trabajando en un sitio web de carrito de compras y me gustaría redirigir al usuario a una página HTTPS cuando ingrese sus detalles de facturación y mantener la conexión HTTPS para las siguientes páginas hasta que cierre la sesión.

¿Qué necesito instalar en el servidor (estoy usando Apache) para hacer esto, y cómo se puede hacer esta redirección desde PHP?

Psique
fuente

Respuestas:

247

Pruebe algo como esto (debería funcionar para Apache e IIS):

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
Raphael Michel
fuente
5
No siempre funciona. Intenté usarlo y no había ningún elemento 'https' en la matriz $ _SERVER debido a que estaba dando un error de 'demasiados redireccionamientos'. Necesitaría usar otro método.
Usman Zaheer
5
Tuve que probar if( $_SERVER['HTTPS'] == "off")para que este código funcionara. Creo que es porque estoy en IIS, no en Apache como el OP.
Nick Pickering
1
@NicholasPickering Jepp, las variables $ _SERVER pueden variar con los servidores web.
Raphael Michel
6
Nota: puede ser importante colocar die () o exit () después de las redirecciones del encabezado para evitar que el resto de la página se ejecute (y posiblemente envíe información adicional al cliente) (es decir, a piratas informáticos o navegadores que pueden no respetar el encabezado).
dajon
3
Dependiendo del entorno / configuración de su servidor, es posible que deba usar $ _SERVER ['HTTP_X_FORWARDED_PROTO'] para verificar http / https
David Meister
19

Esta es una buena forma de hacerlo:

<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
   $_SERVER['HTTPS'] == 1) ||  
   isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
   $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   header('HTTP/1.1 301 Moved Permanently');
   header('Location: ' . $redirect);
   exit();
}
?>
Matiasg1982
fuente
1
funciona bien, el marcado como bueno devolverá una redirección demasiadas veces al menos en Chrome
Thomas J Younsi
La condición !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'siempre será falsa, ya que si la última parte es verdadera, la primera será falsa.
Max
@Max: No entiendo lo que dices. Si la segunda condición es verdadera ($ _SERVER ['HTTPS'] == 'on') entonces la primera condición también tendrá que ser VERDADERA (por supuesto, esa variable de servidor está configurada, ¡porque contiene un valor!)
OMA
7

Redirigir de HTTP a HTTPS con PHP en IIS

Estaba teniendo problemas para lograr que la redirección a HTTPS funcionara en un servidor de Windows que ejecuta la versión 6 de MS Internet Information Services (IIS) . Estoy más acostumbrado a trabajar con Apache en un host Linux, así que busqué ayuda en Internet y esta fue la pregunta de Stack Overflow de mayor rango cuando busqué "php redirect http to https" . Sin embargo, la respuesta seleccionada no funcionó para mí.

Después de algunas pruebas y errores, descubrí que con IIS, $_SERVER['HTTPS']está configurado offpara conexiones que no son TLS. Pensé que el siguiente código debería ayudar a cualquier otro usuario de IIS que llegue a esta pregunta a través del motor de búsqueda.

<?php
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off' ) {
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: $redirect_url");
    exit();
}
?>

Editar : desde otra respuesta de Stack Overflow , una solución más simple es verificar if($_SERVER["HTTPS"] != "on").

Anthony Geoghegan
fuente
13
@JakeSylvestre Bastante justo. Dado que esta pregunta no está etiquetada como apache, publiqué esta respuesta en beneficio de otros usuarios de IIS (similar a la situación en la que me encontraba) que pueden encontrar esta página a través del motor de búsqueda. Me suscribo a la opinión de que las respuestas son en beneficio de la comunidad en su conjunto y no solo del OP.
Anthony Geoghegan
6

Siempre puedes usar

header('Location: https://www.domain.com/cart_save/');

para redirigir a la URL de guardado.

Pero recomendaría hacerlo mediante .htaccess y las reglas de reescritura de Apache.

Powtac
fuente
13
Siempre recomendaría verificar $ _SERVER ['HTTPS'] antes de redireccionar.
Raphael Michel
$ _SERVER ['HTTPS'] no siempre está configurado, pero es una buena idea verificar antes. Es por eso que recomiendo hacerlo con una regla de reescritura útil en Apache, que solo redirige cuando no está en HTTPS.
powtac
Aunque Apache recomienda no usar un archivo .htaccess adicional (porque se ralentiza) sino usar las reglas de reescritura dentro del * .conf de Apache.
powtac
1

En mi servidor de beanstalk de AWS, no veo la variable $ _SERVER ['HTTPS']. Veo $ _SERVER ['HTTP_X_FORWARDED_PROTO'] que puede ser 'http' o 'https', así que si está alojando en AWS, use esto:

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
fénix
fuente