Come reindirizzare tutte le richieste HTTP su HTTPS


294

Sto cercando di reindirizzare tutte le richieste HTTP non sicure sul mio sito (ad esempio http://www.example.com) su HTTPS ( https://www.example.com). Sto usando PHP tra l'altro. Posso farlo in .htaccess?


1
Puoi (e dovresti) farlo attraverso il tuo httpd, non con PHP.
Drudge

2
@jnpcl, mentre sono d'accordo che la soluzione httpd è migliore della soluzione basata su PHP, non penso che un reindirizzamento sistematico sia una buona pratica in generale. Se vuoi reindirizzare i tuoi utenti su HTTPS in ogni momento, inviali lì dal "punto di ingresso" (il primo link al tuo sito), non farlo a metà strada, che potrebbe perdere alcuni dati che potresti pensare è protetto (se non si nota quel reindirizzamento istantaneo).
Bruno,

@Bruno: stavo pensando di più sulla falsariga di richieste HTTP duplicate, il potenziale per le stringhe di query perse e la possibilità che l'utente digitasse manualmentehttp://
drudge

@jnpcl questo è davvero un buon punto. Stavo semplicemente suggerendo che, mentre le persone tendono a chiedere questo tipo di reindirizzamento per migliorare la sicurezza del loro sito, spesso non lo migliora effettivamente (poiché non impedisce alla stessa richiesta di passare prima attraverso il semplice HTTP) .
Bruno,

8
@outis: il primo link che hai pubblicato è questa domanda.
Mei,

Risposte:


305

Aggiornamento: sebbene questa risposta sia stata accettata alcuni anni fa, si noti che il suo approccio è ora sconsigliato dalla documentazione di Apache. Usa Redirectinvece un . Vedere questa risposta .


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

24
@Cat, come dicevo nella mia risposta / commento, se stai cercando di "reindirizzare tutti gli HTTP [...] non sicuri su HTTPS", questo approccio non renderà sicure quelle richieste, renderà solo il browser a farle due volte, una volta insicuro e una volta sicuro.
Bruno,

13
Quello che dovresti davvero fare è usare HSTS in concerto con questo.
Reese Moore,

3
Questo potrebbe essere un bug nella mia versione di apache (2.4.6 come impacchettato in Centos 7), ma questo ha dei problemi per me su alcuni URL. Ad esempio, i http://server/foo?email=someone%40example.comreindirizzamenti , https://server/foo?email=someone%2540example.comovvero al segno "@", vengono citati due volte nell'URL . L'uso del metodo nella risposta di @ ssc non presenta questo problema.
psmears,

2
Risposta sbagliata. Reindirizzerà solo l'URL di base, non gli URL nelle sottocartelle. RewriteRule (. *) Https: //% {HTTP_HOST}% {REQUEST_URI} [R = 301, L] è la risposta corretta
FredTheWebGuy

7
Non sconsigliano necessariamente di farlo:In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
Adam,

338

I documenti Apache sconsigliano di usare una riscrittura:

Per reindirizzare gli httpURL a https, procedi come segue:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Questo frammento dovrebbe andare nel file di configurazione del server principale, non in .htaccessquello richiesto nella domanda.

Questo articolo potrebbe essere uscito solo dopo che la domanda è stata posta e la risposta, ma sembra essere la strada da percorrere.


11
Questa dovrebbe essere la risposta attuale. Ma cosa succede esattamente nella "configurazione SSL"? Un esempio completo sarebbe davvero utile.
Ben

6
@Ben: questa è una domanda diversa che è ampiamente documentata online; per inciso, ho appena aggiunto un esempio quasi completo ieri: serverfault.com/q/597012/26210 che potrebbe darti un'idea di ciò che accade nella configurazione SSL
ssc

46
Questo è un ottimo suggerimento. Ma nel documento Apache menziona anche: "Nel caso del reindirizzamento da http a https, l'uso di RewriteRule sarebbe appropriato se non si ha accesso al file di configurazione del server principale e si è obbligati a eseguire questa attività in un file .htaccess invece. " È il caso per me ...
peter_the_oak,

4
@ user1844933 Se si utilizza la permanentparola chiave, l'effetto è lo stesso (il browser riceve un reindirizzamento 301). Ad esempio:Redirect permanent "/" "https://example.com"
BeetleJuice

2
@Whitecat In Centos 6 il file si trova in /etc/httpd/conf/httpd.conf
dstonek

141

Consiglierei con il reindirizzamento 301:

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

7
grazie, questo funziona per me, la risposta accettata non .. probabilmente a causa della mancanza di[L]
billynoah

1
Sì. Questa è la risposta corretta poiché indirizza anche tutti gli URL nelle sottocartelle
FredTheWebGuy

È al livello più alto del file htaccess?
CodyBugstein,

1
@CodyBugstein È lì che lo posiziono sempre e funziona sempre.
Daan van den Bergh,

3
Tutte le risposte mancano di una cosa: qualsiasi codice per il reindirizzamento deve essere posizionato all'inizio del file .htaccess, PRIMA di qualsiasi altra cosa, se si desidera reindirizzare tutte le pagine su https.
Vadim Anisimov,

35

Come dicevo in questa domanda , suggerirei di evitare di reindirizzare tutte le richieste HTTP al loro equivalente HTTPS alla cieca, poiché potrebbe causare una falsa impressione di sicurezza. Invece, dovresti probabilmente reindirizzare la "radice" del tuo sito HTTP alla radice del tuo sito HTTPS e collegarti da lì, solo a HTTPS.

Il problema è che se un collegamento o un modulo sul sito HTTPS fa sì 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 ha un modulo che dice <form action="http://example.com/doSomething">e invia alcuni dati che non devono essere inviati in modo chiaro, il browser invierà prima la richiesta completa (inclusa l'entità, se è un POST) al sito HTTP primo. Il reindirizzamento verrà inviato immediatamente al browser e, poiché un gran numero di utenti disabilita o ignora gli avvisi, è probabile che venga ignorato.

Naturalmente, 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 riceve qualcosa in ascolto sulla porta HTTP sullo stesso indirizzo IP del sito HTTPS. Tuttavia, penso che mantenere i due siti come un "mirror" aumenti solo le possibilità di commettere errori, poiché potresti tendere a supporre che si auto-correggerà reindirizzando l'utente su HTTPS, mentre spesso è troppo tardi. (Ci sono state discussioni simili in questa domanda. )


1
Quando si prende la decisione di servire un intero sito come HTTPS, questo tipo di reindirizzamento ha senso. Non voglio che un utente ottenga un 403 perché ha specificato http per la sua pagina di destinazione. Sono d'accordo se qualcuno specifica HTTP in un collegamento e lo distribuisce alla produzione che è male. DOVREBBE essere catturato durante i test, anche con il reindirizzamento in atto. Non mi piace l'argomento "could" perché questo "potrebbe" accadere senza il reindirizzamento in atto. I sintomi sono gli stessi quando si esegue il test in un browser sicuro, tranne dopo aver confermato di inviare in chiaro reindirizza invece di ricevere un 403.
Derek Litz

Sì, vedo il vantaggio di fallire duramente se qualcuno inserisce erroneamente http in un'azione di modulo, ma essere indulgenti con gli URL digitati sembra più importante nella maggior parte dei casi.
Daniel Lubarov,

4
@Daniel, sono d'accordo che è utile essere indulgenti quando gli utenti digitano l'URL. Direi che è uno dei casi in cui è meglio disattivare questa funzione durante lo sviluppo / test ma attivarla sulla produzione (o nelle ultime fasi di sviluppo / test).
Bruno,

perché non fare http per https su dns.
Muhammad Umer,

1
@MuhammadUmer, perché non ha nulla a che fare con il DNS. Userebbero lo stesso nome host in generale, ma anche con un nome host diverso, dovrai comunque cambiare protocollo e porta.
Bruno,

18

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

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

Questo non reindirizzerà http://www.example.com/...perché le due condizioni sono implicitamente AND'd. Dovrebbero invece essere OR, ovvero. includi la ORbandiera sulla prima condizione (e ricorda di sfuggire ai punti letterali nella regex). Ma se stai implementando HSTS , non vuoi reindirizzare a HTTPS e www in un unico reindirizzamento, devi prima reindirizzare a HTTPS .
MrWhite,

Dove metto questo testo?
Aaron Franke,

Sul tipo di domanda simile. Qualcuno può aiutare con la domanda qui sotto? stackoverflow.com/questions/59503217/...
appsntech

14

Questo è l'approccio di reindirizzamento HTML che funziona ma non il migliore.

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

Approccio PHP

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess approch

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

copiato da: www.letuslook.org


Dove .htaccessva? Inoltre, quel collegamento è morto.
Aaron Franke,

8

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]

Dove metto questo testo?
Aaron Franke,

6

L'uso del codice seguente nel 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.

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


Cosa significano L e R?
Aaron Franke,

5

Questo è il metodo corretto per reindirizzare HTTP su HTTPS utilizzando .htaccess secondo GoDaddy.com. La prima riga di codice si spiega da sé. La seconda riga di codice controlla se HTTPS è disattivato 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


5

La migliore soluzione dipende dalle tue esigenze. Questo è un riepilogo delle risposte precedentemente pubblicate con l'aggiunta di alcuni contesti.

Se lavori con il web server Apache e puoi modificarne la configurazione, segui la documentazione di Apache :

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Ma hai anche chiesto se puoi farlo in un .htaccessfile. In tal caso è possibile utilizzare RewriteEngine di Apache :

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 da molto tempo e non controllano se è cambiato.

Potrebbe non essere necessaria la prima riga a RewriteEngine Onseconda 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']); 
} 

Sembra che la documentazione di Apache sconsigli la route Rewrite. Che dire di Redirect? Cos'altro può andare in un .htaccessfile?
Aaron Franke,

Sì, il reindirizzamento è preferito e può essere utilizzato in .htaccess. Ma non è possibile aggiungere la condizione per reindirizzare il traffico http su https. Reindirizza anche https -> ciclo di reindirizzamento infinito. L'ho elencato nella direttiva VirtualHost usata per http (porta 80) sopra, .htaccess non supporta quella direttiva e quindi Redirect non può essere usato qui.
maikel

4

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 reindirizzare 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]

Cosa significano L e R?
Aaron Franke,

4

Fai tutto ciò che è spiegato sopra per il reindirizzamento. Aggiungi "HTTP Strict Transport Security" alla tua intestazione. Questo eviterà l'uomo nel mezzo dell'attacco.

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 a VirtualHost:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

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


2

Per reindirizzare tutte le httprichieste a https, è possibile utilizzare:

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

Se mod-rewrite non è abilitato e sei su apache 2.4, puoi anche usare una direttiva Redirectinterna ifper reindirizzare le httprichieste https.

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>

2

Se ti trovi in ​​una situazione in cui non riesci ad accedere direttamente alla configurazione di Apache per il tuo sito, che molte piattaforme ospitate sono ancora limitate in questo modo, allora in realtà consiglierei un approccio in due passaggi. Il motivo per cui gli stessi Apache documentano che è necessario utilizzare prima di tutto le opzioni di configurazione su mod_rewrite per HTTP a HTTPS.

Innanzitutto, come menzionato sopra, dovresti impostare le tue regole .htaccess mod_rewrite:

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 ):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

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 i tuoi script assicurano che non venga fornito alcun output quando non si accede tramite HTTPS.

Immagino che la maggior parte delle persone non la pensi così, e quindi Apache raccomanda di non usare questo metodo ove possibile. Tuttavia, è sufficiente un ulteriore controllo sull'estremità dello 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.


1

Attraverso .htaccess Questo sarà di aiuto.

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, consultare questo per maggiori dettagli. Come reindirizzare Http a Https?


1
Questa è la soluzione da utilizzare per chiunque riceva un "Errore di reindirizzamento troppo" e non possa modificare la proprietà allowOverride.
Evochrome,

1

A meno che tu non abbia bisogno di mod_rewrite per altre cose, l'uso della direttiva IF core di Apache è più semplice e veloce:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

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

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

C'è molta inerzia nell'uso di mod_rewrite per tutto, ma vedi se questo funziona per te.

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

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



0

Ho trovato un metodo per forzare il reindirizzamento di tutte le pagine del mio sito da http a analogico 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]

0
 Redirect 301 / https://example.com/

(ha funzionato per me quando nessuna delle risposte sopra ha funzionato)

Bonus:

ServerAlias www.example.com example.com

(risolto https: // www .example.com non trovato)


0

Questo reindirizza tutti gli URL su https e www

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

0

Se si desidera farlo dal server Tomcat, seguire i passaggi seguenti

In un server HTTP Apache Tomcat (8.5.x) autonomo, come configurarlo in modo che se un utente digita www.domain.com, verrà automaticamente inoltrato al sito https (www.domain.com).

Il metodo in 2 passaggi per includere quanto segue nel tuo [Tomcat_base] /conf/web.xml prima del tag di chiusura

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

e l'impostazione delle impostazioni del connettore [Tomcat_base] /conf/server.xml:

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

Nota: se hai già eseguito la configurazione di https e stai provando a reindirizzare, esegui solo il passaggio 1.



-1

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

La situazione è la seguente: - Il traffico dal browser a Load Balancer e viceversa è (dovrebbe essere) HTTPS - Il traffico tra Load Balancer e 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.

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

La domanda è: come farlo funzionare su un bilanciamento del carico.

(O il bilanciamento del carico è configurato in modo errato. Questo è ciò che spero perché in seguito posso spostare il problema sull'azienda WebHosting :-))


Il reindirizzamento dovrebbe invece avvenire sul bilanciamento del carico. A seconda del tipo di bilanciamento del carico, ciò dovrebbe essere possibile nella configurazione, oppure è un'istanza apache stessa, in cui la risposta accettata funzionerebbe. Basta non farlo sui singoli nodi.
marc82ch,

-1

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

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

Nel file httpd.conf:

<VirtualHost *:80>

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

</VirtualHost>

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 reindirizzare il traffico http sulla tua macchina di sviluppo locale.


-1

Per me funziona:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

e ad esempio, http: // server / foo? email = qualcuno% 40example.com reindirizza normalmente senza problemi. Il file .htaccess situato nella cartella principale del sito Web (ad esempio denominato public_html). È possibile utilizzare RewriteCond% {SERVER_PORT}! ^ 443 $ invece RewriteCond% {HTTPS}! On

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.