HSTS und doppelte Umleitung

9

Ich verwalte eine kleine Website in einer gemeinsam genutzten Hosting-LAMP-Umgebung: Dies bedeutet im Grunde, dass ich nur eine htaccess-Datei bearbeiten kann.

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

Fehler: HTTP leitet zuerst zu www um

http://example(HTTP) sollte sofort zu https://example(HTTPS) umleiten, bevor die www-Subdomain hinzugefügt wird. Derzeit erfolgt die erste Umleitung zu https://www.example.Die zusätzliche Umleitung ist erforderlich, um sicherzustellen, dass jeder Browser, der HSTS unterstützt, den HSTS-Eintrag für die Top-Level-Domain aufzeichnet, nicht nur für die Subdomain.

Ich nehme an, ich sollte Benutzer folgendermaßen umleiten:

  1. http://example (Dies gibt der Benutzer in die Adressleiste seines Browsers ein.)
  2. https://example (Wir leiten ihn zur HTTPS-Version der Website weiter.)
  3. https://www.example (Wir leiten ihn erneut zur Subdomain www weiter.)

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 Umleitung hinzuzufügen:

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

Ich habe jedoch den Fehler "Seite leitet nicht richtig um" vom Browser erhalten.

Wie kann ein Benutzer von der http-Version der Website zum https und schließlich zum https mit www umgeleitet werden? Und: Gibt es Risiken?

HBruijn
quelle

Antworten:

10

Wie in den Übermittlungsanforderungen für die HSTS-Preload-Liste angegeben :

  1. Leiten Sie von HTTP zu HTTPS auf demselben Host um, wenn Sie Port 80 abhören.

Sie müssen zum selben Host (dh HTTP_HOST) umleiten , nicht nur zum example.comersten. Sie müssen nicht umleiten, example.comwenn der Benutzer www.example.comdirekt anfordert . (Der Test beinhaltet eine Anfrage an example.com.) Danach können Sie bei Bedarf zur kanonischen www-Subdomain umleiten.

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

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

Dies würde eine Umleitungsschleife erzeugen, da die vorhergehende RewriteCondAnweisung nur für die erste gilt RewriteRule, sodass die zweite RewriteRulebedingungslos ausgeführt werden würde.

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 HTTP_HOSTServervariable enthält den Wert des HostHTTP-Anforderungsheaders (dh den Host, der angefordert wird).

Die 2. Umleitung besagt ... für alle Anforderungen, bei denen der angeforderte Host nicht gestartet www.wird www., wird dem Host ein Präfix vorangestellt . Dies ist jedoch möglicherweise nicht akzeptabel, wenn Sie mehrere Subdomains (die an denselben Ort aufgelöst werden) getrennt halten möchten, da diese natürlich in die WWW-Subdomain umgeleitet werden.

Beachten Sie, dass dies 302 (temporäre) Weiterleitungen sind. Wechseln Sie nur zu 301, wenn Sie sicher sind, dass es in Ordnung ist.

Und: Gibt es Risiken?

Keine Risiken. Ja, es gibt möglicherweise zwei Weiterleitungen, während es zuvor möglicherweise nur eine gab (was wohl weniger effizient ist). Es gibt aber immer noch nur zwei Weiterleitungen, was für SEO vollkommen in Ordnung ist. Außerdem wird der Benutzeragent mit HSTS die doppelte Umleitung höchstens einmal erfahren.


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

Nebenbei: (HSTS im Moment ignorieren ...) Dies wäre nicht vollständig gewesen, da eine Anfrage für https://example.com/...(dh HTTPS und Domain Apex) nicht kanonisiert wird .


Weiterführende Literatur:

  • Meine Antwort auf eine verwandte Frage zu Pro Webmasters SE, die detaillierter auf die Implementierung von HSTS eingeht .htaccess: /webmasters//a/112264/52912
Herr weiß
quelle
Vielen Dank, ich werde es bald testen. Eine kurze Antwort auf das letzte Nebenbei: Das funktioniert trotzdem, aber es sieht so aus, als ob es etwas ist, das ich nicht direkt steuern kann (zumindest nicht in der htaccess-Datei: Es gibt ein Weiterleitungsfenster im Website-Manager des Hosting-Anbieters)
1
Übrigens funktioniert Ihre Lösung PERFEKT! :-)
1
"Redirect Panel im Hosting Provider Website Manager" - ich wäre immer vorsichtig mit solchen Tools. Beispielsweise ist der Abschnitt "Weiterleitungen" in cPanel sehr begrenzt und eher berüchtigt.
MrWhite
1
Dies hängt davon ab, wie Sie den Strict-Transport-SecurityAntwortheader festlegen. Um dies beispielsweise für die Umleitung festzulegen, müssen Sie das alwaysArgument für die HeaderDirektive verwenden. Ich habe eine verwandte Frage im Pro Webmasters-Stack beantwortet (überspringen Sie den ersten Teil meiner Antwort zu on/ off), in der die Implementierung von "HSTS- Preload " in näher erläutert wird .htaccess.
MrWhite
1
Bitte. Um ehrlich zu sein, ist der Pro Webmasters-Stack wahrscheinlich eher für .htaccessnur verwandte Fragen geeignet (ServerFault setzt voraus, dass Sie die volle Kontrolle über den Server haben. In diesem Fall würden Sie dies nicht tun .htaccess). Es ist wohl einfacher , dies in der Serverkonfiguration mithilfe separater <VirtualHost>Container zu implementieren (da Sie sich nicht mit Umgebungsvariablen und zusätzlichen Bedingungen herumschlagen müssen - es ist "sauberer" und weniger fehleranfällig). Ich glaube nicht, dass ich die Übermittlung der "Preload List" empfehlen würde, wenn Sie nur Zugriff auf haben .htaccess. (Mein 2c)
MrWhite