fragen stichworte

HSTS und doppelte Weiterleitung

Ich verwalte eine kleine Website in einer Shared-Hosting-LAMP-Umgebung: Dies bedeutet im Wesentlichen, dass ich nur eine Htaccess-Datei bearbeiten kann.

Ich wollte HSTS-Unterstützung hinzufügen (und habe es auch getan), aber als meine Website hier auf HSTS-Preload-Berechtigung getestet hat, wurde die folgende Fehlermeldung angezeigt:

Error: HTTP redirects to www first

http://example (HTTP) should immediately redirect to https://example (HTTPS) before adding the www subdomain. Right now, the first redirect is to https://www.example. The extra redirect is required to ensure that any browser which supports HSTS will record the HSTS entry for the top level domain, not just the subdomain.

Ich denke also, ich sollte Benutzer auf diese Weise umleiten:

  1. http://example (Dies ist, was der Benutzer in die Adressleiste seines Browsers eingibt)
  2. https://example (wir leiten ihn auf die HTTPS-Version der Website um)
  3. https://www.example (wir leiten ihn erneut zur Subdomain www um)

Meine aktuelle Weiterleitung erfolgt folgendermaßen:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Ich habe versucht, vor der letzten Zeile eine Weiterleitung hinzuzufügen:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Der Browser hat jedoch die Fehlermeldung "Seite wird nicht ordnungsgemäß umgeleitet".

Wie kann man also einen Benutzer von der http-Version der Website an das https und schließlich an das https mit www umleiten? Und: Gibt es Risiken?

antworten

Wie in den HSTS-Vorladelisten für die Übergabe der Anforderungen:

angegeben
  1. Redirect from HTTP to HTTPS on the same host, if you are listening on port 80.

Sie müssen zum selben Host (d. h. HTTP_HOST) umleiten, nicht einfach zu example.com. Sie müssen nicht zu example.com umleiten, wenn der Benutzer www.example.com direkt anfordert. (Der Test erfordert eine Anfrage an example.com.) Danach können Sie bei Bedarf zur kanonischen www-Unterdomäne umleiten.

I tried to add a redirect before the last line, this way:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Dadurch würde eine Umleitungsschleife erstellt, da die vorhergehende RewriteCond -Direktive nur für die erste RewriteRule gilt, sodass die zweite RewriteRule bedingungslos ausgeführt wird.

Versuchen Sie stattdessen Folgendes:

# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

Die Servervariable HTTP_HOST enthält den Wert des HTTP-Anforderungsheaders Host (dh, welcher Host auch immer angefordert wird).

Die zweite Umleitung gibt an ... für alle Anforderungen, bei denen der angeforderte Host nicht www. startet, und dann dem Host den Präfix www.. Dies kann jedoch nicht akzeptabel sein, wenn Sie mehrere Subdomains haben (die sich an derselben Stelle auflösen), die Sie getrennt halten möchten, da diese natürlich zur www-Subdomain umgeleitet werden.

Beachten Sie, dass es sich um 302 (temporäre) Weiterleitungen handelt. Wechseln Sie nur dann zu 301, wenn Sie sicher sind, dass es ordnungsgemäß funktioniert.

And: are there any risks?

Keine Risiken. Ja, es gibt möglicherweise zwei Weiterleitungen, während es zuvor möglicherweise nur eine gab (was möglicherweise weniger effizient ist). Es gibt jedoch nur zwei Weiterleitungen, was für SEO durchaus in Ordnung ist. Außerdem wird der Benutzer-Agent mit HSTS die doppelte Umleitung höchstens einmal erleben.


RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Nebenbei: (HSTS im Moment ignorieren ...) Dies wäre nicht von selbst abgeschlossen, da eine Anforderung für https://example.com/... (dh HTTPS und Domäne) nicht kanonisiert wird Apex).


Lesen Sie weiter: