risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come reindirizzare tutte le richieste HTTP a HTTPS

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

254
Cat

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


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

Fonte

262
Reese Moore

I documenti Apache consigliano di non utilizzare una riscrittura:

Per reindirizzare http URL a https, effettuare le seguenti operazioni:

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

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

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

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

305
ssc

Lo raccomanderei con il reindirizzamento 301:

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

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

Il problema è che se alcuni link o moduli sul sito HTTPS fanno 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 ha un modulo che dice <form action="http://example.com/doSomething"> e invia alcuni dati che non devono essere inviati in chiaro, il browser invierà per prima cosa l'intera richiesta (inclusa l'entità, se si tratta di un POST) all'HTTP prima il sito. Il reindirizzamento verrà inviato immediatamente al browser e, poiché un numero elevato 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 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é si tende a presupporre che si auto-correggerà reindirizzando l'utente a HTTPS, mentre spesso è troppo tardi. (C'erano discussioni simili in questa domanda. )

33
Bruno

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

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

Questo è l'approccio di reindirizzamento html 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

12
Timothy Nwanwene

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]
9
Cory

Questo è il metodo corretto per reindirizzare HTTP a HTTPS usando .htaccess secondo GoDaddy.com. La prima riga di codice è auto-esplicativa. 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

6
AnarchyOutlaw

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 :

<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 file .htaccess. In tal caso puoi usare 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 molto tempo e non controlleranno se è cambiato.

Potrebbe non essere necessario la prima riga RewriteEngine On 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']); 
} 
6
maikel

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

6
OpenWebWar

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]
5
Rahul

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

<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

4
Waqas

Se ti trovi in ​​una situazione in cui non puoi accedere direttamente alla configurazione di Apache per il tuo sito, che molte piattaforme 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, imposteresti 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 sulle loro esigenze e sulla richiesta che viene 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 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 consiglia di non usare questo metodo laddove possibile. 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'uso di metodi non raccomandati a causa delle restrizioni sui nostri servizi di hosting.

3
F. Scott Gale

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 reindirizzare Http to Https?

2
Roshan Padole

A meno che non sia necessario mod_rewrite per altre cose, l'uso della direttiva IF di nucleo di Apache è più pulito 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 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).

2
SashaK

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

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

Se mod-rewrite non è abilitato e si è su Apache 2.4, è anche possibile utilizzare un Redirect all'interno della direttiva if per reindirizzare le richieste http a https.

Apache 2.4.

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

Ho trovato un metodo per forzare tutte le pagine del mio sito a reindirizzare 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]
1
Oleg Apanovich

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

0
vcsjones

Un Edge diverso da 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. Fornisce un ciclo o semplicemente non funziona. 

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

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

0
BertC

prendi questo codice per te .htaccess file Redirect HTTP to HTTPS automaticamente

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

0
Ehsan Sattari

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 che si trova nella cartella principale del sito Web (ad esempio denominato public_html) .È possibile utilizzare RewriteCond% {SERVER_PORT}! ^ 443 $ invece RewriteCond% {HTTPS}! On

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

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

Bonus:

ServerAlias www.example.com example.com

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

0
aalesund

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 reindirizzare tutto il traffico http a https è descritto qui: https: // aws. Amazon.com/premiumsupport/knowledge-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-forwarded-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 sul tuo computer di sviluppo locale.

0
ScottyB