... beraten RewriteCond %{HTTPS} off
und andere habenRewriteCond %{HTTPS} on
Das wäre in dem gegebenen Kontext nicht sinnvoll, da dies offensichtlich Gegensätze sind (es würde mich interessieren, die vollständigen Beispiele zu sehen, aus denen Sie dies zitieren).
Aber vielleicht meinst du off
vs !on
? Diese sind in diesem Zusammenhang gleichwertig. Das !
Präfix negiert den regulären Ausdruck, was effektiv bedeutet, dass es nicht "Ein" ist (dh es muss "Aus" sein).
Im Kontext Ihrer obigen Anweisungen, in denen Sie testen, ob HTTPS nicht aktiv ist, sind die folgenden Elemente gleichwertig:
# Does the HTTPS server variable contain "off"?
RewriteCond %{HTTPS} off
# Does the HTTPS server variable not contain "on"?
RewriteCond %{HTTPS} !on
Die HTTPS-Servervariable ist entweder auf "Ein" oder "Aus" gesetzt. (Oder es ist überhaupt nicht eingestellt - aber das hängt von Ihrem Server- / SSL-Setup ab, und das haben Sie bereits entdeckt.)
Was Sie verwenden, ist wirklich nur eine Frage der Präferenz.
Weitere Hinweise zu HSTS und .htaccess
# Redirect to www
RewriteCond %{HTTP_HOST} ^example.com\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L]
# Security header
Header set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS
(Ich nehme an, das Extra .com
in ^example.com\.com
ist nur ein Tippfehler? Das sollte gerecht sein ^example\.com
.)
E=HTTPS
- Die Einstellung der Umgebungsvariablen HTTPS
für die RewriteRule
Umleitung scheint erforderlich zu sein, um den Strict-Transport-Security
HTTP-Antwortheader für die kanonische (nur HTTPS) Nicht-WWW-zu-WWW-Umleitung [* 1] (dh https://example.com
bis https://www.example.com
) festzulegen , die bedingt festgelegt wird basierend auf der env=HTTPS
Überprüfung der Header
Richtlinie. Damit dieser Header in der Umleitung festgelegt wird , müssen Sie jedoch auch das always
Schlüsselwort in der Header
Direktive verwenden, z. B.:
Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS
Wie in den Apache-Dokumenten erwähnt , in Bezug auf die Verwendung always
der Header
Direktive beim Festlegen von Headern für Weiterleitungen :
- Sie fügen einer lokal generierten nicht erfolgreichen (nicht 2xx) Antwort einen Header hinzu, z. B. einer Umleitung. In diesem Fall
always
wird in der endgültigen Antwort nur die entsprechende Tabelle verwendet.
[* 1] Dieser Header muss in der Umleitung gesetzt werden, um Punkt 4.1 der Anforderungen für die Übermittlung der HSTS-Vorlast zu erfüllen :
Wenn Sie eine zusätzliche Umleitung von Ihrer HTTPS-Site bereitstellen, muss diese Umleitung weiterhin den HSTS-Header enthalten (und nicht die Seite, auf die sie umgeleitet wird).
Nur ein zusätzlicher Kommentar zu dem verlinkten Artikel in den Kommentaren unten, der besagt:
Die env=HTTPS
Umgebungsvariable funktionierte nicht wie erwartet. Also habe ich das E=HTTPS
Flag in der WWW-Umleitung verwendet, um die env=HTTPS
Umgebungsvariable bei der nächsten Anforderung festzulegen .
Das letzte Bit zum Setzen von " env=HTTPS
Umgebungsvariable bei der nächsten Anforderung" ist nicht ganz richtig. Es setzt die HTTPS
Umgebungsvariable auf die aktuelle (Umleitungs-) Antwort . Zu dem Zeitpunkt, an dem die "nächste Anforderung" erfolgt (dh der Browser hat auf die Umleitung geantwortet), ist diese Umgebungsvariable (die oben festgelegt wurde) längst vergessen. Dies erfordert jedoch, dass das always
Schlüsselwort in der Header
Direktive verwendet wird (wie oben erwähnt).
Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS
Nur ein kleiner Punkt, und vielleicht spielt das eigentlich keine Rolle, aber ... ich würde die preload
Richtlinie am Ende der Liste der Richtlinien einfügen. Zum Beispiel:
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" env=HTTPS
Die preload
Richtlinie ist nicht Teil der HSTS- Spezifikation (HTTP Strict Transport Security) . Es wird nur von der Preload-Liste benötigt. Andere Benutzeragenten / Browser verwenden dies nicht und verstehen dies möglicherweise nicht einmal. Daher wäre es logischer, dies am Ende der Liste zu platzieren. Einige Parses werden möglicherweise beendet, sobald sie eine "ungültige" Direktive erreichen.