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?
http://
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?
http://
Risposte:
Aggiornamento: sebbene questa risposta sia stata accettata alcuni anni fa, si noti che il suo approccio è ora sconsigliato dalla documentazione di Apache. Usa Redirect
invece un . Vedere questa risposta .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
reindirizzamenti , https://server/foo?email=someone%2540example.com
ovvero al segno "@", vengono citati due volte nell'URL . L'uso del metodo nella risposta di @ ssc non presenta questo problema.
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.
I documenti Apache sconsigliano di usare una riscrittura:
Per reindirizzare gli
http
URL ahttps
, 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 .htaccess
quello 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.
permanent
parola chiave, l'effetto è lo stesso (il browser riceve un reindirizzamento 301). Ad esempio:Redirect permanent "/" "https://example.com"
Consiglierei con il reindirizzamento 301:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
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. )
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]
http://www.example.com/...
perché le due condizioni sono implicitamente AND'd. Dovrebbero invece essere OR, ovvero. includi la OR
bandiera 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 .
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
.htaccess
va? Inoltre, quel collegamento è morto.
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'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.
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
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 .htaccess
file. 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 On
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']);
}
.htaccess
file?
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]
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
Per reindirizzare tutte le http
richieste 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 Redirect
interna if
per reindirizzare le http
richieste https
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
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.
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?
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).
porta questo codice al tuo file .htaccess Reindirizza automaticamente HTTP a HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
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]
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]
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.
Se stai usando Apache, mod_rewrite è la soluzione più semplice e ha molta documentazione online su come farlo. Ad esempio: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
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 :-))
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.
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
httpd
, non con PHP.