htaccess-Umleitung zu https: // www

309

Ich habe den folgenden htaccess-Code:

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

Ich möchte, dass meine Site https://www.mit HTTPS umgeleitet wird und die www.Subdomain erzwungen wird. Wenn ich jedoch darauf zugreife http://www.(ohne HTTPS), wird ich nicht https://wwwmit HTTPS umgeleitet .

Bigben
quelle
Sollte seinRewriteCond %{HTTPS} =off
Michael Berkowski
1
Wenn ich das mache, wird es zu https weitergeleitet: // ww ww w w.
Bigben
Lieber @bigben, du hast hier eine falsche Antwort akzeptiert! Sie können herausfinden, warum es in meiner Antwort falsch ist .
Amir Fo

Antworten:

632

Um zuerst HTTPS zu erzwingen, müssen Sie die richtige Umgebungsvariable überprüfen %{HTTPS} off, aber Ihre obige Regel stellt dann das vor. www.Da Sie eine zweite Regel erzwingen www.müssen, verwenden Sie sie nicht in der ersten Regel.

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]

Über das Proxying

Bei einigen Proxy-Formen, bei denen der Client über HTTPS eine Verbindung zu einem Proxy, Load Balancer, einer Passagieranwendung usw. herstellt, kann die %{HTTPS}Variable niemals oneine Umschreibschleife sein. Dies liegt daran, dass Ihre Anwendung tatsächlich einfachen HTTP-Verkehr empfängt, obwohl der Client und der Proxy / Load Balancer HTTPS verwenden. Überprüfen Sie in diesen Fällen den X-Forwarded-ProtoHeader anstelle der %{HTTPS}Variablen. Diese Antwort zeigt den entsprechenden Prozess

Michael Berkowski
quelle
14
In einigen Fällen ist Ihr Zertifikat möglicherweise nur für eine einzelne Domain geeignet (es funktioniert möglicherweise mit www, aber nicht beispielsweise ohne). In solchen Fällen leiten Sie zuerst zur richtigen Domain und dann zu https um. Andernfalls wird in Ihrem Browser eine Zertifizierungsfehlermeldung angezeigt.
Nick Benson
19
Wenn ich RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]eine URL wie exaple.com/?bla=%20 verwendete, wurde exaple.com/?bla=%2520 , dh das Prozentzeichen wurde codiert. Verwenden Sie das Flag NE, um eine doppelte Codierung zu verhindern:RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
Schlagen Sie den
5
Dies gibt mir eine Umleitungsschleife auf einem Server, funktioniert auf einem anderen. Ich weiß wirklich nicht warum
user151496
4
@ user151496 Verwendet der fehlerhafte Server irgendeine Art von HTTP-Proxy, z. B. durch einen Lack-Cache oder in Passenger? In diesem Fall müssen Sie möglicherweise den X-Forwarded-ProtoHeader überprüfen, um HTTPS anstelle der %{HTTPS}Variablen zu überprüfen . Sie haben nicht gesagt, welcher Teil die Schleife, den wwwoder den HTTPS-Teil verursacht, aber das ist das erste, was mir in den Sinn kommt.
Michael Berkowski
5
Genau genommen sind die beiden oben genannten Regeln in der falschen Reihenfolge. Wenn eine Anfrage eingeht (z http://example.com. B. HTTP und Nicht-WWW), erhalten Sie eine doppelte Umleitung. Zuerst zu https://example.com(der ersten Regel) und dann zu https://www.example.com(der zweiten Regel). Sie können dies beheben, indem Sie diese beiden Regeln einfach umkehren, da beide Regeln unabhängig davon zu HTTPS umleiten.
MrWhite
148

Michals Antwort hat bei mir funktioniert, wenn auch mit einer kleinen Modifikation:

Problem:

Wenn Sie über ein Sicherheitszertifikat für eine einzelne Site verfügen , einen Browser, der versucht, ohne https: // www auf Ihre Seite zuzugreifen. (oder welche Domain auch immer Ihr Zertifikat abdeckt) zeigt einen hässlichen roten Warnbildschirm an, bevor es überhaupt die Weiterleitung zur sicheren und korrekten https-Seite erhält.

Lösung

Verwenden Sie zuerst die Umleitung zum WWW (oder zu der Domain, für die Ihr Zertifikat gilt) und führen Sie dann die https-Umleitung durch. Dadurch wird sichergestellt, dass Ihre Benutzer nicht mit Fehlern konfrontiert werden, da Ihr Browser ein Zertifikat sieht, das die aktuelle URL nicht abdeckt.

#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]
Larzan
quelle
5
+1, da dies die bessere Option für dieses Szenario ist. Beachten Sie jedoch, dass dies nicht das gleiche Problem verhindert, wenn der Client darauf zugreift https://example.com. Meiner Meinung nach ist dies jedoch das Format mit der geringsten Wahrscheinlichkeit, das von einem Benutzer eingegeben wird. (Die akzeptierte Antwort wird auch das gleiche Problem haben)
Joshua Goossen
@ Larzan: Das ist falsch. Die Zertifizierungsausnahme tritt nur auf, weil Sie zwei echte Weiterleitungen durchführen. Ersetzen Sie "[L, R = 301]" durch "[R = 301]". Dann werden die Regeln nicht abgebrochen. L = LAST
defim
Wenn Sie https://ohne wwwein Zertifikat wwwauskommen müssen, fügen RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301] Sie einfach diese Regel zur Lösung hinzu: Sie geht einfach zurück, httpwenn Sie versuchen, eine Verbindung herzustellen https://example.com, um Zertifikatfehler zu vermeiden.
Eric Burel
1
Die beiden Regeln sollten ohnehin umgekehrt werden (wie Sie es getan haben), um eine doppelte Umleitung bei der Anforderung zu verhindern http://example.com(dh HTTP und kein www)
MrWhite
@EricBurel In diesem Fall können Sie den Zertifizierungsfehler nicht vermeiden. Der SSL-Handshake erfolgt vor der Ausführung Ihres Codes (das ist in erster Linie der springende Punkt bei SSL). Wenn Ihre Umleitung vor dem Zertifizierungsfehler des Browsers ausgeführt werden konnte, bedeutet dies, dass die Anforderung bereits über eine unsichere Verbindung gestellt wurde - ein grundlegender Fehler im SSL-Modell.
MrWhite
99

Wenn Sie CloudFlare oder ein ähnliches CDN verwenden, wird bei den hier bereitgestellten% {HTTPS} -Lösungen ein Endlosschleifenfehler angezeigt. Wenn Sie ein CloudFlare-Benutzer sind, müssen Sie Folgendes verwenden:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Andrew
quelle
2
Bitte beachten Sie, dass die aktuellen Hinweise auf der Cloudflare-Support-Website etwas anders sind: support.cloudflare.com/hc/en-us/articles/…
ColinMcDermott
1
Stimmen Sie mit @ h0mayun überein, der Rat, den Cloudflare gibt, führt zu Ergebnissen in einer Umleitungsschleife, während dieser Code hier perfekt funktioniert - danke!
Hobailey
2
Ich starte anglejs auf ec2. Die Lösungen mit RewriteCond% {HTTPS}! = On geben mir eine unendliche Umleitung (nicht ganz sicher warum). Diese Lösung mit X-Forwarded-Proto scheint den Trick zu tun. Danke dir!
Mark Watkins
3
Ich =httphabe !=httpsfür unsere Umgebungen geändert . X-Forwarded-ProtoHeader wurde nicht deklariert, wenn http, so !=httpsauch der Trick.
Johnathan Elmore
Vielen Dank für diesen Einblick! Ich habe stundenlang versucht herauszufinden, warum {HTTPS}es nicht funktioniert. Ich habe es versucht {ENV:HTTPS}und sogar {SERVER_PORT} 443, aber am Ende war es, weil ich nach den benutzerdefinierten HTTP-Anforderungsheadern von Cloudflare suchen musste.
Camslice
56

SCHLECHTE LÖSUNG UND WARUM!

Verwenden Sie niemals die unten stehende Lösung, denn wenn Sie ihren Code verwenden, ist das ungefähr so:

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]

Der Browser geht zu:

http://example.com

Leitet dann weiter zu:

https://example.com

Leitet dann weiter zu:

https://www.example.com

Dies ist zu viel Anfrage an den Server.

Die meisten Antworten, die sogar akzeptiert wurden, haben dieses Problem.


BESTE LÖSUNG UND DIE ANTWORT

Dieser Code hat die [OR]Bedingung, doppelte Änderungen an der URL zu verhindern!

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]
Amir Fo
quelle
3
"SCHLECHTE LÖSUNG UND WARUM!" - Diese Regeln sind nur in der falschen Reihenfolge. Wenn Sie diese beiden Regeln umkehren, ist dies korrekt. Sie erhalten nur eine Weiterleitung und nicht zwei.
MrWhite
4
Ja, der angegebene Code führt zu 2 Weiterleitungen - das bestreite ich nicht - ich sage nur, dass Sie diese Regeln einfach umkehren müssen, um dieses Problem zu beheben. Es sind keine weiteren Änderungen erforderlich. (Die "akzeptierte" Antwort ist in der Tat falsch - was anscheinend das ist, worauf Sie sich beziehen - die Anweisungen sind in der falschen Reihenfolge.)
MrWhite
1
yup @AmirForsati ist richtig. Es wird zweimal umgeleitet und dies sollte die akzeptierte Antwort sein.
Zakir Hussain
4
Sie können dies verwenden, wenn Sie die Domainname-Variable behalten möchten: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
Dies leitet mich weiter wp-content/cache/page_enhanced/und dann so weiter. Wie kann ich das beheben? Bearbeiten: Sieht so aus, als müsste ich es oben platzieren .htaccess. Danke für das Drehbuch :)
Giacomo
35

Dies ist der beste Weg, den ich für Proxy- und nicht für Proxy-Benutzer gefunden habe

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
llioor
quelle
2
Richtig Dies ist der beste Weg, den ich für Proxy- und nicht für Proxy-Benutzer gefunden habe. +1
Deep 3015
1
Dies ist die beste, da sie mehrere 301 Weiterleitungen löst
Niraj Chauhan
1
beste Lösung aller Zeiten.
SM Jobayer Alam
1
Gute Antwort. Dies ist der einzige, der für mich gearbeitet hat. Funktioniert, wenn Sie sich hinter Cloudflare befinden (obwohl bei Cloudflare keine Seitenregeln eingerichtet sind).
Jasonco
Die einzige Lösung, die in allen meinen Fällen funktioniert. Aber was ist, wenn ich das Gegenteil tun und alle "www" entfernen möchte?
FedeKrum
27

Es gibt viele Lösungen. Hier ist ein Link zum Apache-Wiki, das sich direkt mit diesem Problem befasst.

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
Vynz
quelle
Ich fand, dass durch Ändern der Umschreibbedingung von RewriteCond %{HTTPS} offin RewriteCond %{HTTPS} !=ondiese Umleitung immer passieren würde, dies scheint mir die bessere Antwort zu sein.
Samuel Hawksby-Robinson
Diese Lösung sollte als richtige Antwort akzeptiert werden! Hat auch für mich gearbeitet!
AndrewShmig
11

Um http: // oder https: // zu https: // www umzuleiten , können Sie für alle Apache-Versionen die folgende Regel verwenden:

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]

Beachten Sie, dass die Variable% {REQUEST_SCHEME} seit Apache 2.4 zur Verwendung verfügbar ist .

starkeen
quelle
1
Problem!: Wenn HTTP_HOST bereits www enthält. Aber Schema ist nicht HTTPS, dann landen Sie bei www.www. in Ihrem Gastgeber.
Jpsy
@Jpsy du hast recht. Ich habe das Umleitungsziel aktualisiert. Danke für deinen Beitrag.
starkeen
1
Dies ist fast das, wonach ich gesucht habe, aber ich möchte die Domain wie in anderen Beispielen generisch halten. Ist es möglich?
Cronoklee
8

Wenn Sie sich in CloudFlare befinden, stellen Sie sicher, dass Sie Folgendes verwenden.

# 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

Dies erspart Ihnen die Umleitungsschleife und leitet Ihre Site sicher zu SSL um.

PS Es ist eine gute Idee, wenn Sie die mod_rewrite.c überprüfen!

Ahmad Awais
quelle
https: // theurlwithoutwww.com wird nicht zu https: // www umgeleitet.
Theearentthedroids
Dies ist eigentlich nur eine funktionierende Lösung, wenn Sie zuvor einige Anweisungen zum Hinzufügen von WWW haben. Andere Lösungen geben mir "zu vielen Weiterleitungen".
Daniel.P.
3
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
Анастасия Ермолик
quelle
2
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Hinweise: Stellen Sie sicher, dass Sie die folgenden Schritte ausgeführt haben

  1. sudo a2enmod umschreiben
  2. sudo service apache2 neu starten
  3. Fügen Sie Folgendes in Ihre vhost-Datei ein, die sich unter /etc/apache2/sites-available/000-default.conf befindet
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

Jetzt funktioniert Ihr .htaccess und Ihre Site wird zu http: // zu https: // www umgeleitet

Kundan Roy
quelle
1

Ähnlich wie bei Amir Forsatis Lösung htaccess-Umleitung zu https: // www, aber für einen variablen Domainnamen schlage ich vor:

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]
Bernhard Bodenstorfer
quelle
0

Legen Sie in Ihrer .htaccess-Datei fest

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]
Adam Kozlowski
quelle
-2

Ich versuche die erste Antwort und es funktioniert nicht ... Diese Arbeit:

<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
Jackssn
quelle