Apache schreibt alle Subdomains außer einer in Nicht-WWW-HTTPS um

Apache schreibt alle Subdomains außer einer in Nicht-WWW-HTTPS um

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:

  1. Eine Anfrage an http://www.example.netwird zwei Weiterleitungen haben.

  2. Wie bei den meisten Umleitungsbeispielen von www zu nicht-www auf dieser Site erfolgt keine Umleitung, ww.und wwww.daher weist meine Analyse viele falsch eingegebene Subdomänen auf, die nicht umgeleitet wurden.

  3. Ich möchte die dev.Subdomäne http://dev.example.netsowie ihre httpsSchwesterdomäne von der Weiterleitung ausschließen, da ich sie dev.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.netverfügt über zwei Weiterleitungen.

Dies kann durch einfaches Umkehren der beiden Regeln behoben werden. Dann www.example.netwird 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.und wwww.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äne http://dev.example.netund ihre httpsSchwesterdomäne von der Weiterleitung ausschließen, da ich sie dev.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 HostHTTP-Anforderungsheader zuzugreifen), falls dies eine Anforderung des Lastenausgleichs ist. Andernfalls ist es üblicher, HTTP_HOSThier 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 HostFall 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]
  1. NCDer Bedingung wurde das Flag ( nocase) hinzugefügt X-Forwarded-Proto, da sein Wert scheinbar keine Rolle bei der Groß- und Kleinschreibung spielt HTTP = Http = hTTp = http, d. h. Sie können es gerne entfernen.
  2. 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-ProtoVaryhttphttps
  3. 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.novaryHostVary
  4. RewriteRuleDie Reihenfolge der Flaggen wurde vereinheitlicht ( L,R=301und R=301,List im Wesentlichen gleich).
  5. Wird daran gehindert www.example.net.but.not.actually.yours.com, erkannt zu werden, erlaubt aber trotzdem zB www.example.net:443.
  6. Durchgängig %{REQUEST_URI}als Ersatz verwenden.
  7. Erkennen Sie auch wwund wwww.

verwandte Informationen