Come redirect tutte le richieste HTTP a HTTPS

Sto provando a redirect tutte le richieste HTTP non sicure sul mio sito (ad esempio http://www.example.com ) su HTTPS ( https://www.example.com ). Sto usando PHP btw. Posso farlo in .htaccess?

Aggiornamento: Sebbene questa risposta sia stata accettata qualche anno fa, si noti che il suo approccio è ora sconsigliato dalla documentazione di Apache. Utilizza invece un Redirect . Vedi questa risposta


 RewriteEngine On RewriteCond %{HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

fonte

I documenti Apache consigliano di non utilizzare una riscrittura:

Per redirect gli URL http a https , fai quanto segue:

  ServerName www.example.com Redirect / https://www.example.com/   ServerName www.example.com # ... SSL configuration goes here  

Questo snippet dovrebbe entrare nel file di configurazione del server principale, non in .htaccess come richiesto nella domanda.

Questo articolo potrebbe essere venuto fuori solo dopo che la domanda è stata posta e ha risposto, ma sembra essere la strada corrente da percorrere.

Lo raccomanderei con il reindirizzamento 301:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Come stavo dicendo in questa domanda , ti suggerirei di evitare di redirect ciecamente tutte le richieste HTTP al loro equivalente HTTPS, in quanto potrebbe causare una falsa impressione di sicurezza. Invece, dovresti probabilmente redirect la “root” del tuo sito HTTP alla radice del tuo sito HTTPS e collegarti da lì, solo a HTTPS.

Il problema è che se qualche link o modulo sul sito HTTPS fa in modo che il client invii una richiesta al sito HTTP, il suo contenuto sarà visibile, prima del reindirizzamento.

Ad esempio, se una delle tue pagine pubblicate su HTTPS presenta un modulo che dice

e invia alcuni dati che non devono essere inviati in chiaro, il browser invierà prima la richiesta completa (inclusa l’ quadro, se si tratta di un POST) prima al sito HTTP. Il reindirizzamento verrà inviato immediatamente al browser e, poiché un numero elevato di utenti disabilita o ignora gli avvisi, è probabile che venga ignorato.

Ovviamente, l’errore di fornire i collegamenti che dovrebbero essere al sito HTTPS ma che finiscono per essere per il sito HTTP può causare problemi non appena si ottiene qualcosa in ascolto sulla porta HTTP sullo stesso indirizzo IP del sito HTTPS. Tuttavia, ritengo che mantenere i due siti come uno “specchio” aumenti le possibilità di commettere errori, poiché tendenzialmente si suppone che si auto-correggerà reindirizzando l’utente a HTTPS, mentre spesso è troppo tardi. (C’erano discussioni simili in questa domanda ) .

Ho scoperto che il modo migliore per https e www su dominio è

 RewriteCond %{HTTPS} off RewriteCond %{HTTPS_HOST} !^www.cheapcarhire.gr$ [NC] RewriteRule ^(.*)$ https://www.cheapcarhire.gr/$1 [L,R=301] 

Questo è l’approccio di reindirizzamento html funziona ma non il migliore.

   

Approccio PHP

  

.htaccess approch

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

copiato da: http://www.letuslook.org

Mi piace questo metodo di reindirizzamento da http a https. Perché non ho bisogno di modificarlo per ogni sito.

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

L’utilizzo del seguente codice nel tuo file .htaccess reindirizza automaticamente i visitatori alla versione HTTPS del tuo sito:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Se hai un file .htaccess esistente:

Non duplicare RewriteEngine On.

Assicurarsi che le righe che iniziano con RewriteCond e RewriteRule seguano immediatamente il RewriteEngine On già esistente.

Aggiungi il seguente codice al file .htaccess:

 Options +SymLinksIfOwnerMatch RewriteEngine On RewriteCond %{SERVER_PORT} !=443 RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L] 

Dove [il tuo nome di dominio] è il nome di dominio del tuo sito web.

Puoi anche redirect cartelle specifiche fuori dal tuo nome di dominio sostituendo l’ultima riga del codice sopra con:

 RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L] 

Questo è il metodo corretto per redirect HTTP a HTTPS usando .htaccess secondo GoDaddy.com. La prima riga di codice è auto-esplicativa. La seconda riga di codice controlla se HTTPS è distriggersto e in tal caso reindirizza HTTP a HTTPS eseguendo la terza riga di codice, altrimenti la terza riga di codice viene ignorata.

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828

La soluzione migliore dipende dalle tue esigenze. Questo è un riassunto delle risposte precedentemente pubblicate con qualche contesto aggiunto.

Se si lavora con il server Web Apache e si può modificare la sua configurazione, seguire la documentazione di Apache :

  ServerName www.example.com Redirect "/" "https://www.example.com/"   ServerName www.example.com # ... SSL configuration goes here  

Ma hai anche chiesto se puoi farlo in un file .htaccess . In tal caso puoi utilizzare Apache’s RewriteEngine :

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L] 

Se tutto funziona correttamente e desideri che i browser ricordino questo reindirizzamento, puoi dichiararlo come permanente modificando l’ultima riga in:

 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Ma fai attenzione se puoi cambiare idea su questo reindirizzamento. I browser lo ricordano per un tempo molto lungo e non controlleranno se è cambiato.

Potrebbe non essere necessario il RewriteEngine On della prima riga, a seconda della configurazione del server web.

Se cerchi una soluzione PHP, guarda l’ array $ _SERVER e la funzione header :

 if (!$_SERVER['HTTPS']) { header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); } 

Fai tutto ciò che è spiegato sopra per il reindirizzamento. Basta aggiungere “HTTP Strict Transport Security” alla tua intestazione. Ciò eviterà l’uomo nell’attacco centrale.

Modifica il tuo file di configurazione di apache (/etc/apache2/sites-enabled/website.conf e /etc/apache2/httpd.conf per esempio) e aggiungi quanto segue al tuo VirtualHost:

 # Optionally load the headers module: LoadModule headers_module modules/mod_headers.so  Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"  

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

Per redirect tutte le richieste http a https , puoi utilizzare:

 RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R] 

Se la riscrittura mod non è abilitata e si è su apache 2.4, è anche ansible utilizzare un Redirect all’interno if direttiva per redirect le richieste http a https .

Apache 2.4.

  Redirect / https://www.example.com/  

Attraverso .htaccess Questo aiuterà.

 RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] 

Inoltre, fai riferimento a Ulteriori dettagli. Come redirect Http to Https?

A meno che non sia necessario mod_rewrite per altre cose, l’utilizzo della direttiva IF di nucleo di Apache è più semplice e veloce:

  Redirect permanent / https://yoursite.com/  

È ansible aggiungere più condizioni alla direttiva IF, ad esempio garantire un singolo dominio canonico senza il prefisso www:

  Redirect permanent / https://myonetruesite.com/  

C’è molta inerzia nella familiarità nell’uso di mod_rewrite per tutto, ma vedi se questo funziona per te.

Maggiori informazioni: https://httpd.apache.org/docs/2.4/mod/core.html#if

Per vederlo in azione (prova senza www. O https: //, o con .net invece di .com): https://nohodental.com/ (un sito su cui sto lavorando).

Se ti trovi in ​​una situazione in cui non puoi accedere alla configurazione di apache direttamente per il tuo sito, che molte piattaforms ospitate sono ancora limitate in questo modo, allora consiglierei un approccio in due passaggi. Il motivo per cui gli stessi Apache documentano che dovresti usare le loro opzioni di configurazione prima di tutto sul mod_rewrite per HTTP su HTTPS.

Innanzitutto, come detto sopra, dovresti configurare le tue regole mod_rewrite .htaccess:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Quindi, nei tuoi file PHP (devi farlo ovunque sia appropriato per la tua situazione, alcuni siti incanaleranno tutte le richieste attraverso un singolo file PHP, altri serviranno varie pagine a seconda delle loro esigenze e della richiesta fatta ):

  

Quanto sopra deve essere eseguito PRIMA di qualsiasi codice che potrebbe potenzialmente esporre dati protetti in un ambiente non protetto. Pertanto, il tuo sito utilizza il reindirizzamento automatico tramite HTACCESS e mod_rewrite, mentre gli script assicurano che non venga fornito alcun output quando non si accede tramite HTTPS.

Immagino che molte persone non la pensino così, e quindi Apache raccomanda di non usare questo metodo laddove ansible. Tuttavia, è sufficiente un controllo extra sullo sviluppo per garantire la sicurezza dei dati dell’utente. Speriamo che questo aiuti qualcun altro che potrebbe dover esaminare l’utilizzo di metodi non raccomandati a causa delle restrizioni sui nostri servizi di hosting.

Ho trovato un metodo per forzare tutte le pagine del mio sito a redirect da http a analog delle pagine su https che funzionano per me.

 RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Se si utilizza Apache, mod_rewrite è la soluzione più semplice e ha un sacco di documentazione online su come farlo. Ad esempio: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

Un altro vantaggio rispetto a questo problema è quando entra in gioco un Load Balancer.

La situazione è la seguente: – Traffico dal browser a Load Balancer e ritorno, è (dovrebbe essere) HTTPS – Il traffico tra Load Balancer e il WebServer effettivo è HTTP.

Quindi, tutte le variabili di richiesta del server in PHP o Apache mostrano che la connessione è solo HTTP. E le directory HTTP e HTTPS sul server sono le stesse.

La RewriteCondition nella risposta approvata non funziona. Dà o un ciclo o semplicemente non funziona.

La domanda è: come farlo funzionare su un Load Balancer.

(O il Load Balancer è configurato in modo errato, che è quello che spero perché poi posso trasferire il problema alla società WebHosting :-))

Se utilizzi un servizio di bilanciamento del carico elastico Amazon Web Services che accetta il traffico https e lo indirizza ai tuoi server con http, il modo corretto per redirect tutto il traffico http su https è descritto qui: https: //aws.amazon. com / premiumsupport / conoscenze-center / redirect-http-https-ELB

Utilizzare l’intestazione X-Forwarded-Proto (contenente http o https) che è sempre inclusa nelle richieste http dal servizio di bilanciamento del carico, come descritto qui: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x- inoltrato-headers.html

Nel file httpd.conf:

  RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]  

O nel tuo file .htaccess di root:

 RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent] 

Bonus: non tenterà di redirect il traffico http sul tuo computer di sviluppo locale.