
Ich versuche, die Anzahl der 301-Weiterleitungsketten auf meinem Server zu reduzieren. Daher möchte ich eine Weiterleitung von einer Subdomäne zu einer Nicht-www-Weiterleitung (außer wenn die Subdomäne ist dev
) mit einer Weiterleitung von HTTP zu HTTPS (unter Verwendung von %{HTTP:X-Forwarded-Proto}
) kombinieren, da sich die Instanz hinter einem Load Balancer befindet.
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
wird zwei Weiterleitungen haben.Wie bei den meisten Umleitungsbeispielen von www zu nicht-www auf dieser Site erfolgt keine Umleitung,
ww.
undwwww.
daher weist meine Analyse viele falsch eingegebene Subdomänen auf, die nicht umgeleitet wurden.Ich möchte die
dev.
Subdomänehttp://dev.example.net
sowie ihrehttps
Schwesterdomäne von der Weiterleitung ausschließen, da ich siedev.
für die Entwicklung und das Release-Staging verwende.
Wie gehe ich vor, um dies zu kombinieren?
Antwort1
1) Eine Anfrage an
http://www.example.net
verfügt über zwei Weiterleitungen.
Dies kann durch einfaches Umkehren der beiden Regeln behoben werden. Dann www.example.net
wird bei der ersten Umleitung auf HTTPS umgeleitet, sodass die Umleitung von HTTP auf HTTPS nicht ausgelöst werden muss.
(Dies setzt jedoch voraus, dass Sie nicht beabsichtigen,HSTS- in diesem Fall müssten Sie sie als zwei Weiterleitungen beibehalten, da die Weiterleitung zu HTTPS auf demselben Hostnamen erfolgtErsteist eine Voraussetzung.)
2) Wie bei den meisten Umleitungsbeispielen von www zu nicht-www auf dieser Site erfolgt keine Umleitung,
ww.
undwwww.
daher weist meine Analyse viele falsch eingegebene Subdomänen auf, die nicht umgeleitet wurden.
Normalerweise werden Anfragen an ww.
oder wwww.
Subdomains einfach nicht aufgelöst, daher ist dies normalerweise kein Problem. Damit dies funktioniert, müssen Sie Folgendes konfiguriert haben:PlatzhalterSubdomäne im DNS und konfigurierte den Server so, dass er solche Anfragen akzeptiert.
Dies kann jedoch berücksichtigt werden, indem der reguläre Ausdruck (Ausschnitt) von ^www\.
in geändert wird ^w{2,4}\.
.
3) Ich möchte die
dev.
Subdomänehttp://dev.example.net
und ihrehttps
Schwesterdomäne von der Weiterleitung ausschließen, da ich siedev.
für die Entwicklung und das Release-Staging verwende.
Dies gilt nur für die Regel „HTTP-zu-HTTPS“, daher kann hier eine zusätzliche Bedingung angewendet werden, um Hostnamen auszuschließen, die mit beginnen dev.
.
Versuchen Sie unter Berücksichtigung der oben genannten Punkte Folgendes:
# 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 desselben beibehalten HTTP:Host
(um auf den Host
HTTP-Anforderungsheader zuzugreifen), falls dies eine Anforderung des Lastenausgleichs ist. Andernfalls ist es üblicher, HTTP_HOST
hier die Servervariable zu verwenden.
Das !
Präfix auf derBedingungsmuster(dh. !^dev\.
) negiert den regulären Ausdruck, so dass die Bedingung erfüllt ist, wenn dies der Host
Fall ist.nichtBeginnen Sie mit dev.
. (Ich nehme an, www.dev.
das gibt es nicht?)
(.*)
ist dasselbe wie, ^(.*)$
da der reguläre Ausdruck standardmäßig gierig ist.
Sie müssen vor dem Testen den Cache Ihres Browsers leeren. Es ist ratsam, zunächst mit 302 (temporären) Weiterleitungen zu testen, um Cache-Probleme zu vermeiden.
Antwort2
# 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]
NC
Der Bedingung wurde das Flag (nocase
) hinzugefügtX-Forwarded-Proto
, da sein Wert scheinbar keine Rolle bei der Groß- und Kleinschreibung spieltHTTP = Http = hTTp = http
, d. h. Sie können es gerne entfernen.- Der Bedingung wurde das Flag
NV
(novary
) hinzugefügt , um es aus dem Antwortheader auszublenden. Auch hier können Sie dies gerne entfernen, insbesondere wenn dies nicht der Fall ist (der Reverse-Proxy filtert es ohnehin automatisch für Sie, bevor es an den Client gesendet wird) oder für ein korrektes Cacheverhalten erforderlich ist (der Cache unterscheidet ansonsten nicht zwischen Inhalt und Inhalt).X-Forwarded-Proto
Vary
http
https
- Dem Header-Zustand wurde das Flag
NV
( ) hinzugefügt , um ihn aus dem Antwortheader auszublenden . Sie können dies auch entfernen, wenn Ihr Cache-Server defekt ist.novary
Host
Vary
RewriteRule
Die Reihenfolge der Flaggen wurde vereinheitlicht (L,R=301
undR=301,L
ist im Wesentlichen gleich).- Wird daran gehindert
www.example.net.but.not.actually.yours.com
, erkannt zu werden, erlaubt aber trotzdem zBwww.example.net:443
. - Durchgängig
%{REQUEST_URI}
als Ersatz verwenden. - Erkennen Sie auch
ww
undwwww
.