htaccess reindirizza a https: // www


309

Ho il seguente codice htaccess:

<IfModule mod_rewrite.c>

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

</IfModule>

Voglio che il mio sito venga reindirizzato https://www.con HTTPS e imposto il www.sottodominio, ma quando accedo http://www.(senza HTTPS), non mi reindirizza a https://wwwcon HTTPS.


Dovrebbe essereRewriteCond %{HTTPS} =off
Michael Berkowski il

1
Se lo faccio, reindirizza a https: / / ww ww w w.
bigben,

Caro @bigben, hai accettato una risposta sbagliata qui! puoi scoprire perché è sbagliato nella mia risposta .
Amir Fo

Risposte:


632

Per forzare prima HTTPS, è necessario controllare la variabile di ambiente corretta %{HTTPS} off, ma la regola precedente precede quindi www.Poiché è necessario applicare una seconda regola www., non utilizzarla nella prima regola.

RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

A proposito di proxy

Dietro alcune forme di proxy, per cui il client si connette tramite HTTPS a un proxy, un bilanciamento del carico, un'applicazione Passeggero, ecc., La %{HTTPS}variabile potrebbe non essere mai one causare un ciclo di riscrittura. Questo perché l'applicazione sta effettivamente ricevendo un semplice traffico HTTP anche se il client e il proxy / bilanciamento del carico utilizzano HTTPS. In questi casi, controlla l' X-Forwarded-Protointestazione anziché la %{HTTPS}variabile. Questa risposta mostra il processo appropriato


14
In alcuni casi il tuo certificato potrebbe essere valido solo per un singolo dominio (potrebbe funzionare con www, ma, non senza, per esempio). In questi casi, reindirizza prima al dominio corretto, quindi reindirizza a https, altrimenti visualizzerai un messaggio di errore cert nel tuo browser.
Nick Benson,

19
Quando ho usato RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]un URL come exaple.com/?bla=%20 è diventato exaple.com/?bla=%2520 , ovvero il segno di percentuale è stato codificato. Prendi in considerazione l'uso della bandiera NEper impedire la doppia codifica:RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
Batti il

5
questo mi dà un ciclo di reindirizzamento su un server, funziona su un altro. davvero non so perché
user151496

4
@ user151496 Il server in errore utilizza qualsiasi tipo di proxy HTTP, come passare attraverso una cache Varnish o in Passenger? In tal caso, potrebbe essere necessario controllare l' X-Forwarded-Protointestazione per verificare HTTPS anziché la %{HTTPS}variabile. Non hai detto quale parte causa il ciclo, la wwwparte HTTPS o, ma questa è la prima cosa che mi viene in mente.
Michael Berkowski,

5
A rigor di termini, le due regole che hai sopra sono nell'ordine sbagliato. Se arriva una richiesta per http://example.com(es. HTTP e non www), otterrai un doppio reindirizzamento. Prima a https://example.com(la prima regola) e poi a https://www.example.com(la seconda regola). Puoi risolvere questo problema semplicemente invertendo queste due regole, poiché entrambe le regole reindirizzano a HTTPS a prescindere.
MrWhite,

148

La risposta di Michal ha funzionato per me, anche se con una piccola modifica:

Problema:

quando disponi di un certificato di sicurezza per sito singolo , un browser che tenta di accedere alla tua pagina senza https: // www. (o qualsiasi dominio coperto dal tuo certificato) mostrerà una brutta schermata di avviso rossa prima ancora che possa ricevere il reindirizzamento alla pagina https sicura e corretta.

Soluzione

Per prima cosa usa il reindirizzamento al www (o qualunque dominio sia coperto dal tuo certificato) e solo allora esegui il reindirizzamento https. Questo assicurerà che i tuoi utenti non debbano affrontare alcun errore perché il tuo browser vede un certificato che non copre l'URL corrente.

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

5
+1 perché è l'opzione migliore per questo scenario, ma nota che ciò non impedirà lo stesso problema se il client accede https://example.com, ma a mio avviso è il formato meno probabile da digitare da parte di un utente. (Anche la risposta accettata avrà lo stesso problema)
Joshua Goossen

@Larzan: è sbagliato. L'eccezione di certificazione si verifica solo perché si eseguono 2 reindirizzamenti reali . Sostituisci "[L, R = 301]" con "[R = 301]". Queste regole non vengono abortite. L = ULTIMO
defim

Se è necessario gestire https://senza wwwavere un certificato solo su www, aggiungere semplicemente questa regola alla soluzione: RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301] torna semplicemente a httpquando si tenta di connettersi https://example.comper evitare errori di certificato.
Eric Burel,

1
Le due regole dovrebbero essere invertite comunque (come hai fatto), al fine di evitare un doppio reindirizzamento quando richiesto http://example.com(es. HTTP e no www)
MrWhite

@EricBurel Non è possibile evitare l'errore cert in questa istanza: l'handshake SSL si verifica prima dell'esecuzione del codice (che è in primo luogo l'intero punto di SSL). Se il reindirizzamento fosse in grado di eseguire prima che il browser segnalasse l'errore, ciò implicherebbe che la richiesta era già stata effettuata tramite una connessione non sicura, il che sarebbe un errore fondamentale nel modello SSL.
MrWhite,

99

Se stai usando CloudFlare o un CDN simile, otterrai un errore di ciclo infinito con le soluzioni% {HTTPS} fornite qui. Se sei un utente CloudFlare dovrai utilizzare questo:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

2
Si prega di notare che l'attuale consiglio sul sito di supporto di Cloudflare è leggermente diverso: support.cloudflare.com/hc/en-us/articles/…
ColinMcDermott

1
Concordo con @ h0mayun, il consiglio Cloudflare fornisce risultati in un ciclo di reindirizzamento, mentre questo codice qui funziona perfettamente - grazie!
hobailey,

2
Corro angularjs su ec2. Le soluzioni che usano RewriteCond% {HTTPS}! = On mi danno un reindirizzamento infinito (non sono del tutto sicuro del perché). Questa soluzione, con X-Forwarded-Proto, sembra fare il trucco. Grazie!
Mark Watkins,

3
Ho modificato =httpper !=httpsper i nostri ambienti. X-Forwarded-Protol'intestazione non è stata dichiarata se http, così ha !=httpsfatto il trucco.
Johnathan Elmore,

Grazie per questa intuizione! Ho passato ore a cercare di capire perché {HTTPS}non funzionasse. Ci ho provato {ENV:HTTPS}e anche {SERVER_PORT} 443, ma alla fine è stato perché dovevo controllare le intestazioni delle richieste HTTP personalizzate di Cloudflare.
Camslice,

56

MALE SOLUZIONE E PERCHÉ!

Non usare mai la soluzione qui sotto perché quando stai usando il loro codice è qualcosa di simile:

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

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.example.com%{REQUEST_URI} [L,R=301]

Il browser va a:

http://example.com

Quindi reindirizza a:

https://example.com

Quindi reindirizza a:

https://www.example.com

Questa è troppa richiesta al server.

La maggior parte delle risposte anche accettate ha questo problema.


MIGLIORE SOLUZIONE E LA RISPOSTA

Questo codice ha una [OR]condizione per impedire doppie modifiche all'URL!

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

3
"CATTIVA SOLUZIONE E PERCHÉ!" - Quelle regole sono nell'ordine sbagliato. Invertire queste due regole e sarà corretto: otterrai solo un reindirizzamento e non due.
MrWhite,

4
Sì, il codice come indicato risulta in 2 reindirizzamenti - non lo sto contestando - tutto quello che sto dicendo è che devi semplicemente invertire queste regole per risolvere questo problema, non sono necessarie altre modifiche. (La risposta "accettata" è in effetti errata - che sembra essere ciò a cui ti riferisci - le direttive sono nell'ordine sbagliato.)
MrWhite

1
yup @AmirForsati ha ragione. viene reindirizzato due volte e questa dovrebbe essere la risposta accettata.
Zakir hussain,

4
Puoi usarlo se vuoi mantenere la variabile domainname:RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
I.devries

Questo mi sta reindirizzando wp-content/cache/page_enhanced/e così via. Come posso risolvere questo problema? Modifica: sembra che devo metterlo in cima .htaccess. Grazie per la sceneggiatura :)
Giacomo,

35

Questo è il modo migliore che ho trovato per utenti proxy e non proxy

RewriteEngine On

### START WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### END WWW & HTTPS

2
Corretto Questo è il modo migliore che ho trovato per gli utenti Proxy e non proxy +1
Deep 3015

1
Questo è il migliore, poiché risolve più reindirizzamenti 301
Niraj Chauhan,

1
la migliore soluzione di sempre.
SM Jobayer Alam,

1
Bella risposta. Questo è l'unico che ha funzionato per me. Funziona se sei dietro Cloudflare (anche se non ho regole di pagina impostate su Cloudflare).
Jasonco,

L'unica soluzione che funziona su tutti i miei casi. Ma cosa succede se voglio fare di fronte e rimuovere tutto "www".
FedeKrum

27

Ci sono molte soluzioni là fuori. Ecco un link al wiki di Apache che tratta direttamente questo problema.

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context

Ho scoperto modificando la condizione di riscrittura da RewriteCond %{HTTPS} offa RewriteCond %{HTTPS} !=onquel reindirizzamento sarebbe sempre accaduto, questa mi sembra la risposta migliore.
Samuel Hawksby-Robinson,

Questa soluzione dovrebbe essere accettata come una risposta corretta! Ha funzionato anche per me!
AndrewShmig,

11

Per reindirizzare http: // o https: // su https: // www puoi usare la seguente regola su tutte le versioni di apache:

RewriteEngine on

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Apache 2.4

RewriteEngine on

RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Nota che la variabile% {REQUEST_SCHEME} è disponibile per l'uso da apache 2.4 .


1
Problema !: Se HTTP_HOST contiene già www. ma lo schema non è HTTPS, quindi si finisce con www.www. nel tuo host.
Jpsy,

@Jpsy hai ragione. Ho aggiornato la destinazione di reindirizzamento. Grazie per il tuo contributo.
Starkeen,

1
Questo è quasi quello che stavo cercando, ma voglio mantenere il dominio generico come in altri esempi. È possibile?
cronoklee,

8

Se sei su CloudFlare, assicurati di utilizzare qualcosa del genere.

# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END SSL Redirect

Questo ti salverà dal ciclo di reindirizzamento e reindirizzerà il tuo sito su SSL in modo sicuro.

PS È una buona idea verificare se mod_rewrite.c!


non reindirizza https: // theurlwithoutwww.com a https: // www.
thesearentthedroids

Questa è in realtà una soluzione funzionante solo se si dispone in anticipo di alcune direttive "Aggiungi www". Altre soluzioni mi danno "a molti reindirizzamenti".
Daniel.P.


2
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Note: assicurarsi di aver eseguito i seguenti passaggi

  1. sudo a2enmod rewrite
  2. sudo service apache2 restart
  3. Aggiungi seguito nel tuo file vhost, situato in /etc/apache2/sites-available/000-default.conf
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

Ora il tuo .htaccess funzionerà e il tuo sito reindirizzerà a http: // a https: // www


1

Simile alla soluzione di Amir Forsati htaccess reindirizzamento a https: // www ma per il nome di dominio variabile, suggerisco:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%2%{REQUEST_URI} [R=301,L]

0

Imposta nel tuo file .htaccess

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


-2

Provo la prima risposta e non funziona ... Questo lavoro:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
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.