htaccess leitet nicht-www zu www mit SSL / HTTPS um

10

Ich möchte eine Umschreiberegel, die alles zu https:// AND umleitet www.

Zum Beispiel http://example.comsollte gehenhttps://www.example.com

Das habe ich:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule ^(.*)$ "https\:\/\/www\.example\.com\/$1" [R=301,L]
Wille
quelle

Antworten:

11

Ich habe die Lösung gefunden.

Ohne HSTS (Single Redirect):

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

Mit HSTS (Double Redirect):

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Wille
quelle
1
Beachten Sie, dass dies bei der Anforderung zu einer doppelten Umleitung führt http://example.com(dh HTTP und Nicht-WWW), da zuerst auf demselben Host (dh ohne www) zu HTTPS umgeleitet und dann wwwals zweite Umleitung umgeleitet wird. Sie können dies korrigieren, indem Sie diese beiden Regeln einfach umkehren.
MrWhite
@MrWhite @Wollen Sie tatsächlich eine doppelte Umleitung für eine ordnungsgemäße https://Umleitung wünschen , insbesondere wenn Sie HSTS verwenden. Auf diese Weise kann Ihre HSTS-Präferenz vom Browser sowohl für Ihre Domains gespeichert werden, und nachfolgende Anforderungen werden immer standardmäßighttps://
xsrf
@xsrf Es ist immer noch "richtig" (und effizienter), eine einzige WWW- und HTTPS-Umleitung zu haben. Es nur muss getrennt gehalten werden , wenn Sie HSTS implementieren.
MrWhite
Beide guten Punkte von xsrf und MrWhite. Ich habe die Antwort aktualisiert.
Will
@xsrf Ich habe die doppelte Weiterleitung mit htaccess.madewithlove.be überprüft und es scheint, dass sie nur http: //> https: // nicht www umleitet .
Will
6

Ihre Bedingungen sind implizit UND-verknüpft und Ihre zweite Bedingung ist immer erfüllt (es sei denn, Sie haben andere Domänen), sodass Ihre aktuellen Regeln nur Nicht-SSL-Verkehr umleiten.

Sie müssen ORdie Bedingungen erfüllen und die www(zweite) Bedingung negieren :

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Wenn das SERVER_PORTnicht 443 ist (dh nicht HTTPS ist) oder der Host nicht mit beginnt www.(dh Sie greifen auf die nackte Domain zu), leiten Sie zur kanonischen URL weiter.

Ob dies jedoch umleiten https://example.comzu https://www.example.comauf Sicherheitszertifikat abhängen. (Auf Ihre Site muss sowohl über www als auch über www über SSL zugegriffen werden können, damit die .htaccess-Umleitung ausgelöst wird.)

Herr weiß
quelle
1

Dies gilt sowohl für www als auch für nicht www. Wenn Sie versuchen, einen Link mit www zu öffnen, leiten Sie die URL mit www an https weiter

Beispiel: http://domain.comWeiterleiten anhttps://domain.com

oder Wenn Sie versuchen, einen Link mit Nicht-WWW zu öffnen, leiten Sie die URL mit Nicht-WWW zu https um

Beispiel: http://www.domain.comWeiterleiten anhttps://www.domain.com

RewriteEngine on

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Ajay Patidar
quelle
Dies behandelt nicht die in der Frage angegebene Umleitung von Nicht-WWW zu WWW.
MrWhite
Sie können diese Zeile in htaccess RewriteCond% {HTTP_HOST}! ^ Www \ hinzufügen. RewriteRule ^ (. *) $ % {HTTP_HOST} / $ 1 [R = 301, L]
Ajay Patidar
Ersetzen RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] durchRewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [R=301,L]
Ajay Patidar
Sie können Ihre Antwort bearbeiten .
MrWhite