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 Website mit HTTPS zu https://www.
umgeleitet wird und die www.
-Unterdomäne erzwingt, Wenn ich jedoch auf http://www.
(ohne HTTPS) zugreifen, leite ich mich nicht mit HTTPS an https://www
um.
Um HTTPS zuerst erzwingen zu können, müssen Sie die korrekte Umgebungsvariable %{HTTPS} off
überprüfen. In der obigen Regel wird jedoch www.
vorangestellt. Da Sie eine zweite Regel zur Durchsetzung von www.
haben, 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]
Hinter einigen Formen des Proxyings, bei denen der Client über HTTPS eine Verbindung zu einem Proxy, einem Lastverteiler, einer Passagieranwendung usw. herstellt, kann die Variable %{HTTPS}
niemals on
sein und eine Überschreibungsschleife verursachen. Dies liegt daran, dass Ihre Anwendung tatsächlich nur HTTP-Datenverkehr empfängt, obwohl der Client und der Proxy/Load-Balancer HTTPS verwenden. Überprüfen Sie in diesen Fällen den X-Forwarded-Proto
-Header anstelle der %{HTTPS}
-Variablen. Diese Antwort zeigt den entsprechenden Prozess
Michals Antwort funktionierte für mich, wenn auch mit einer kleinen Modifikation:
Problem:
wenn Sie über ein Sicherheitszertifikatsingle siteverfügen, ein Browser, der versucht, ohne https: // www auf Ihre Seite zuzugreifen. (oder was auch immer die Domäne ist, die Ihr Zertifikat abdeckt) zeigt einen unschönen roten Warnbildschirm an , bevor die Weiterleitung zur sicheren und richtigen https-Seite empfangen wird.
Lösung
Verwenden Sie zuerst die Weiterleitung zum WWW (oder die von Ihrem Zertifikat abgedeckte Domäne), und führen Sie dann nur die HTTPS-Weiterleitung durch. Dadurch wird sichergestellt, dass Ihre Benutzer nicht mit Fehlern konfrontiert werden, da Ihrem Browser ein Zertifikat angezeigt wird, 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]
Wenn Sie CloudFlare oder ein ähnliches CDN verwenden, erhalten Sie mit den hier bereitgestellten% {HTTPS} -Lösungen einen unendlichen Schleifenfehler. 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]
Verwenden Sie niemals die oben genannte Lösung, denn wenn Sie ihren Code verwenden, bedeutet dies Folgendes:
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 an:
http://example.com
Dann Weiterleitungen an:
https://example.com
Dann Weiterleitungen an:
https://www.example.com
Dies ist zu viel request an den Server
Dieser Code hat eine [OR]
-Bedingung, um 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]
Die meisten Antworten wurden sogar akzeptiert, verwenden Sie diesen Trick nicht.
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
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
Um http: // oder https: // zu https: // www umzuleiten, können Sie die folgende Regel in allen Apache-Versionen 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 verwendet werden kann.
Wenn Sie mit CloudFlare arbeiten, stellen Sie sicher, dass Sie so etwas 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.
P.S. Es ist eine gute Idee, die mod_rewrite.c zu überprüfen!
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
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R]
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
- Sudo a2enmod umschreiben
- Sudo-Dienst Apache2 neu starten
- Fügen Sie Folgendes in Ihrer vhost-Datei unter /etc/Apache2/sites-available/000-default.conf hinzu
<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.
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]