Apache schreibt jede Subdomain außer einer in nicht-www https um
Ich versuche, die Anzahl der 301-Umleitungsverkettungen auf meinem Server zu reduzieren, daher möchte ich eine Subdomain mit einer Nicht-WWW-Umleitung (außer wenn sich die Subdomain befindet dev
) mit einer HTTP-zu-HTTPS-Umleitung (mit %{HTTP:X-Forwarded-Proto}
) kombinieren, da sich die Instanz dahinter befindet ein Load Balancer.
Folgendes habe ich bisher in meinem .htaccess
:
# move http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
# Remove leading www
RewriteCond %{HTTP_HOST} ^www.example.net [NC]
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]
Bei meiner derzeitigen Implementierung gibt es drei Probleme:
Eine Anfrage an
http://www.example.net
hat zwei Weiterleitungen.Wie die meisten www nicht-www Redirect Beispiele auf dieser Seite, wird es nicht umleiten
ww.
oderwwww.
so meinen Analytics hat viele vertippt Domänen , die nicht umgeleitet haben.Ich möchte die
dev.
Subdomain von der Umleitung ausschließen, alsohttp://dev.example.net
und ihrehttps
Geschwister, wie ich siedev.
für die Entwicklung und Freigabe von Staging verwende.
Wie soll ich das kombinieren?
Antworten
1) Eine Anfrage an
http://www.example.net
hat zwei Weiterleitungen.
Dies kann durch einfaches Umkehren der beiden Regeln behoben werden. Dann www.example.net
wird auf HTTPS in der ersten Umleitung umgeleitet, so dass der HTTP auf HTTPS Umleitung nicht auf Trigger benötigen.
(Dies setzt jedoch voraus, dass Sie nicht beabsichtigen, HSTS zu implementieren. In diesem Fall müssten Sie sie als zwei Weiterleitungen beibehalten, da eine Umleitung zu HTTPS auf demselben Hostnamen zuerst erforderlich ist.)
2) Wie die meisten www nicht-www Redirect Beispiele auf dieser Seite, wird es nicht umleiten
ww.
oderwwww.
so meinen Analytics hat viele vertippt Domänen , die nicht umgeleitet haben.
Normalerweise werden Anfragen an ww.
oder wwww.
Subdomains einfach nicht gelöst, daher ist dies normalerweise kein Problem. Damit dies funktioniert, müssen Sie eine Platzhalter- Subdomain in DNS konfiguriert und den Server so konfiguriert haben, dass er solche Anforderungen akzeptiert.
Dies kann jedoch durch Ändern des regulären Ausdrucks (Snippet) von ^www\.
bis berücksichtigt werden ^w{2,4}\.
.
3) Ich möchte die
dev.
Subdomain von der Umleitung ausschließen, alsohttp://dev.example.net
und ihrehttps
Geschwister, wie ich siedev.
für die Entwicklung und Freigabe von Staging verwende.
Dies gilt nur für die HTTP-zu-HTTPS-Regel. Daher kann hier eine zusätzliche Bedingung angewendet werden, um beginnende Hostnamen auszuschließen dev.
.
Versuchen Sie Folgendes, indem Sie die oben genannten Punkte zusammenführen:
# Remove leading ww, www or wwww (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^w{2,4}\.example\.net [NC]
RewriteRule (.*) https://example.net/$1 [R=301,L]
# Move http to https (except dev subdomain)
RewriteCond %{HTTP:Host} !^dev\. [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP:Host}%{REQUEST_URI} [R=301,L]
Ich habe Ihre Verwendung beibehalten HTTP:Host
(um auf den Host
HTTP-Anforderungsheader zuzugreifen ), falls dies eine Anforderung des Load Balancers ist. Andernfalls wird hier häufiger die HTTP_HOST
Servervariable verwendet.
Das !
Präfix auf dem CondPattern (dh. !^dev\.
) Negiert die regex, so die Bedingung erfolgreich ist , wenn das Host
nicht nicht mit starten dev.
. (Ich nehme an, www.dev.
ist nichts?)
(.*)
ist das gleiche wie ^(.*)$
da der reguläre Ausdruck standardmäßig gierig ist.
Sie müssen Ihren Browser-Cache vor dem Testen leeren. Es ist ratsam, zuerst mit 302 (temporären) Weiterleitungen zu testen, um Caching-Probleme zu vermeiden.
# Remove leading www, always using https regardless of the current URL scheme
RewriteCond %{HTTP_HOST} ^w{2,4}.example.net(?::|$) [NC,NV] RewriteRule .* https://example.net%{REQUEST_URI} [L,R=301] # move http to https, except for dev.example.net RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC,NV] RewriteCond %{HTTP_HOST} !^dev.example.net(?::|$) [NC,NV]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
- Das Flag
NC
(nocase
) wurde zu derX-Forwarded-Proto
Bedingung hinzugefügt , da sein Wert unbedeutend zu sein schien, dHTTP = Http = hTTp = http
. H. Sie können dies entfernen. - Flag
NV
(novary
) zurX-Forwarded-Proto
Bedingung hinzugefügt , um sie vor demVary
Antwortheader auszublenden . Auch hier können Sie dies entfernen, insbesondere wenn dies nicht der Fall ist (der Reverse-Proxy filtert es ohnehin automatisch für Sie, bevor Sie es an den Client senden) oder für ein korrektes Cache-Verhalten erforderlich ist (der Cache unterscheidethttp
und unterscheidet denhttps
Inhalt nicht). - Flag
NV
(novary
) zurHost
Header-Bedingung hinzugefügt , um sie vor demVary
Antwortheader auszublenden . Sie können dies auch entfernen, wenn Sie einen defekten Cache-Server haben. - Die
RewriteRule
Flag-Reihenfolge wurde konsistent gemacht (L,R=301
undR=301,L
ist im Wesentlichen gleich). - Verhindert
www.example.net.but.not.actually.yours.com
erkannt zu werden, erlaubt aber trotzdem zwww.example.net:443
. - Konsequent
%{REQUEST_URI}
als Ersatz verwenden. - Auch erkennen
ww
undwwww
.