Reindirizzamento da HTTP a HTTPS con PHP


107

Sto lavorando a un sito Web di un carrello della spesa e vorrei reindirizzare l'utente a una pagina HTTPS quando inserisce i dettagli di fatturazione e mantenere la connessione HTTPS per le pagine successive fino a quando non si disconnette.

Cosa devo installare sul server (sto usando Apache) per farlo, e come può essere eseguito questo reindirizzamento da PHP?

Risposte:


247

Prova qualcosa di simile (dovrebbe funzionare per 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;
}

5
Non funziona sempre. Ho provato a usarlo e non c'era l'elemento "https" nell'array $ _SERVER a causa del quale dava l'errore di "troppi reindirizzamenti". Avrebbe bisogno di usare un altro metodo.
Usman Zaheer

5
Ho dovuto provare if( $_SERVER['HTTPS'] == "off")per far funzionare questo codice. Penso che sia perché sono su IIS, non Apache come l'OP.
Nick Pickering

1
@NicholasPickering Jepp, le variabili $ _SERVER potrebbero variare con i server web.
Raphael Michel

6
Nota: die () o exit () possono essere importanti da inserire dopo il reindirizzamento dell'intestazione per impedire l'esecuzione del resto della pagina (e possibilmente l'invio di informazioni aggiuntive al client) (ad esempio ad hacker o browser che potrebbero non rispettare l'intestazione).
dajon

3
A seconda dell'ambiente / configurazione del server, potrebbe essere necessario utilizzare $ _SERVER ['HTTP_X_FORWARDED_PROTO'] per verificare la presenza di http / https
David Meister

19

Questo è un buon modo per farlo:

<?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();
}
?>

1
funziona bene quello contrassegnato come buono restituirà un reindirizzamento troppe volte almeno in Chrome
Thomas J Younsi

La condizione !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'sarà sempre falsa, poiché se l'ultima parte è vera, la prima sarà falsa.
Max

@ Max: non capisco quello che dici. Se la seconda condizione è vera ($ _SERVER ['HTTPS'] == 'on') allora anche la prima condizione dovrà essere TRUE (ovviamente quella variabile del server è impostata, perché contiene un valore!)
OMA

7

Reindirizzamento da HTTP a HTTPS con PHP su IIS

Ho avuto problemi a ottenere il reindirizzamento a HTTPS per lavorare su un server Windows che esegue la versione 6 di MS Internet Information Services (IIS) . Sono più abituato a lavorare con Apache su un host Linux, quindi mi sono rivolto a Internet per chiedere aiuto e questa era la domanda Stack Overflow con il punteggio più alto quando ho cercato "php redirect http to https" . Tuttavia, la risposta selezionata non ha funzionato per me.

Dopo alcuni tentativi ed errori, ho scoperto che con IIS $_SERVER['HTTPS']è impostato offper le connessioni non TLS. Ho pensato che il seguente codice dovrebbe aiutare tutti gli altri utenti IIS che arrivano a questa domanda tramite il motore di ricerca.

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

Modifica : da un'altra risposta di Stack Overflow , una soluzione più semplice è controllare if($_SERVER["HTTPS"] != "on").


13
@ JakeSylvestre Abbastanza giusto. Dato che questa domanda non è contrassegnata come apache, ho pubblicato questa risposta a beneficio di altri utenti IIS (simile alla situazione in cui mi trovavo) che potrebbero imbattersi in questa pagina tramite il motore di ricerca. Mi associo all'idea che le risposte siano a vantaggio della comunità nel suo insieme e non solo dell'OP.
Anthony Geoghegan

6

Puoi sempre usare

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

per reindirizzare all'URL di salvataggio.

Ma consiglierei di farlo tramite .htaccess e le regole di riscrittura di Apache.


13
Consiglio sempre di controllare $ _SERVER ["HTTPS"] prima di reindirizzare.
Raphael Michel

$ _SERVER ['HTTPS'] non è sempre impostato, ma è una buona idea controllare prima. Ecco perché consiglio di farlo con un'utile regola di riscrittura in Apache, che reindirizza solo quando non è su HTTPS.
powtac

Sebbene Apache sconsigli di utilizzare un file .htaccess aggiuntivo (perché rallenta) ma di utilizzare le regole di riscrittura all'interno del * .conf di Apache.
powtac

1

Sul mio server beanstalk AWS, non vedo la variabile $ _SERVER ['HTTPS']. Vedo $ _SERVER ["HTTP_X_FORWARDED_PROTO"] che può essere "http" o "https", quindi se stai ospitando su AWS, utilizza questo:

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.