Apache schreibt jede Subdomain außer einer in nicht-www https um

Jan 30 2020

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:

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

  2. Wie die meisten www nicht-www Redirect Beispiele auf dieser Seite, wird es nicht umleiten ww.oder wwww.so meinen Analytics hat viele vertippt Domänen , die nicht umgeleitet haben.

  3. Ich möchte die dev.Subdomain von der Umleitung ausschließen, also http://dev.example.netund ihre httpsGeschwister, wie ich sie dev.für die Entwicklung und Freigabe von Staging verwende.

Wie soll ich das kombinieren?

Antworten

1 MrWhite Jan 31 2020 at 05:43

1) Eine Anfrage an http://www.example.nethat zwei Weiterleitungen.

Dies kann durch einfaches Umkehren der beiden Regeln behoben werden. Dann www.example.netwird 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.oder wwww.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, also http://dev.example.netund ihre httpsGeschwister, wie ich sie dev.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 HostHTTP-Anforderungsheader zuzugreifen ), falls dies eine Anforderung des Load Balancers ist. Andernfalls wird hier häufiger die HTTP_HOSTServervariable verwendet.

Das !Präfix auf dem CondPattern (dh. !^dev\.) Negiert die regex, so die Bedingung erfolgreich ist , wenn das Hostnicht 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.

2 Jin-ohKang Jan 31 2020 at 05:52
# 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. Das Flag NC( nocase) wurde zu der X-Forwarded-ProtoBedingung hinzugefügt , da sein Wert unbedeutend zu sein schien, d HTTP = Http = hTTp = http. H. Sie können dies entfernen.
  2. Flag NV( novary) zur X-Forwarded-ProtoBedingung hinzugefügt , um sie vor dem VaryAntwortheader 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 unterscheidet httpund unterscheidet den httpsInhalt nicht).
  3. Flag NV( novary) zur HostHeader-Bedingung hinzugefügt , um sie vor dem VaryAntwortheader auszublenden . Sie können dies auch entfernen, wenn Sie einen defekten Cache-Server haben.
  4. Die RewriteRuleFlag-Reihenfolge wurde konsistent gemacht ( L,R=301und R=301,List im Wesentlichen gleich).
  5. Verhindert www.example.net.but.not.actually.yours.comerkannt zu werden, erlaubt aber trotzdem z www.example.net:443.
  6. Konsequent %{REQUEST_URI}als Ersatz verwenden.
  7. Auch erkennen wwund wwww.