... 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.
!=on
ist effektiv das gleiche wie!on
in diesem Zusammenhang (das Ergebnis ist hier das gleiche). Es gibt jedoch einen Unterschied. Das=
Präfix ist es ein exakter String - Vergleich, während ohne=
, es ist ein Regex und so überprüft „auf“ überall in der Teststring . Es kann immer nur "Ein" oder "Aus" sein, daher ist das Ergebnis das gleiche. Sehr interessant über die Verwendung vonE=HTTPS
on the redirect - mein erster Kommentar dazu war falsch. Sie müssen jedoch dasalways
Schlüsselwort zurHeader
Direktive hinzufügen , damit dies funktioniert. Ich habe meine Antwort aktualisiert.Überprüfen Sie, ob HTTPS NICHT aktiviert ist
Überprüfen Sie, ob HTTPS ausgeschaltet ist
Überprüfen Sie, ob die Verbindung NICHT auf dem sicheren https-Port 443 ausgeführt wird
Aber alle machen dasselbe: Überprüfen Sie, ob kein https vorhanden ist, und leiten Sie zu https um.
Sie wissen bereits, was es tut.
quelle
<IfModule>
Wrapper wird hier nicht benötigt. Wenn Sie sich für die "HSTS-Preload-Liste" entscheiden, sollte der Wrapper entfernt werden, da dieser Header obligatorisch ist . Sie vermissen auch die empfohleneenv=HTTPS
Bedingung.IfModule
Der Wrapper dient zu Überprüfungszwecken, ob das adressierte Modul bereits installiert ist. In Bezug aufenv=HTTPS
ich bin sicher nicht - es gibt eine Reihe von Beispielen , mit und ohne daran zu arbeiten.IfModule
Wrapper dient zu Überprüfungszwecken ..." - Ja, aber das ist das Problem. Wenn mod_headers nicht installiert ist, schlägt die Direktive einfach stillschweigend fehl und der Header wird nicht gesetzt. Dieser Header muss gesetzt sein, damit HSTS erfolgreich ist. Dies sollte unterbrochen werden , wenn mod_headers nicht verfügbar ist, da dieser Header nicht optional ist. Sehen Sie diese Frage im Zusammenhang mit Bezug auf mod_rewrite (gleiche Idee): webmasters.stackexchange.com/questions/112600/...