it-swarm.com.de

.htaccess, das HTTP_Host verwendet, hat eine zusätzliche externe Umleitung, wenn HTTPS erzwungen wird

Wenn ich diese Zeilen in meiner .htaccess -Datei verwende, funktioniert alles gut:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://example.com%{REQUEST_URI} [L,R=301]

enter image description here

Dann habe ich versucht, es zum Laufen zu bringen, ohne die Domain manuell in die URL zu schreiben, und stattdessen diese Zeilen ausprobiert:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301] 

Aber jetzt gibt es eine zusätzliche Weiterleitung, wenn von www ohne https erreicht:

enter image description here

Ich verstehe nicht warum, ich habe gerade die Domain durch {HTTP_Host} ersetzt. Wenn ich das tue, leitet es von http://www.example.com zu http://example.com um (da es meine Hauptdomain ist), dann http://example.com zu https://example.com

Wenn ich diese Zeile hinzufüge: RewriteCond %{HTTP_Host} !^www\. [NC], ändert sich nichts.

Warum verhält es sich so und wie kann ich die .htaccess -Datei so einstellen, dass die URL nicht manuell geschrieben und http://www.example.com direkt an https://example.com umgeleitet werden muss?

3
imlost

Wenn Sie immer den www. aus dem Host-Namen entfernen möchten, sollten Sie Ihre ersten Regeln verwenden, die den Domain-Namen enthalten. Dies liegt daran, dass die Variable {HTTP_Host} den vollständigen Hostnamen einschließlich aller Unterdomänen enthält. Wenn also mit http://www.example.com auf die Site zugegriffen wird, ist HTTP_Hostwww.example.com. Wenn Sie diese Variable in der Umleitung verwenden, wird der www. eingeschlossen.

Wenn Sie wirklich dagegen sind, Ihren Domain-Namen in dieser Umschreiberegel fest zu codieren, können Sie möglicherweise von HTTP_Host zu SERVER_NAME wechseln. Die Servernamenvariable kann als Ihr bevorzugter Hostname festgelegt werden, wie in Ihrer virtuellen Hostkonfiguration angegeben, jedoch nur, wenn UseCanonicalName on ebenfalls aktiviert ist. Siehe Was ist der Unterschied zwischen HTTP_Host und SERVER_NAME in PHP? Ihre virtuelle Host-Konfiguration müsste lauten:

<VirtualHost *>
    ServerName example.com
    UseCanonicalName on
    ServerAlias www.example.com
    ...
</VirtualHost>

Möglicherweise haben Sie keine so genaue Kontrolle über Ihre virtuelle Host-Direktive. Viele Hosting-Pakete wie cPanal und WHM schreiben die Konfiguration für Sie und lassen Sie nicht ändern. Ich würde empfehlen, in Ihrer Umschreiberegel an Ihrem fest codierten Domain-Namen festzuhalten, da dies einfach ist und funktioniert.

1

tl; dr In Ihrer Codebasis befindet sich noch etwas, das umgeleitet wird. Die Direktiven, die Sie in der Frage gepostet haben, erklären die Ausgabe, die Sie sehen, nicht (vollständig). Tatsächlich werden die Anweisungen, die Sie aus Ihrer .htaccess -Datei gepostet haben, möglicherweise überhaupt nicht verarbeitet ...

(Diese Antwort ist wirklich eine Ergänzung zu @ Stephens Antwort und versucht, die Ergebnisse, die Sie sehen, zu erklären - oder in Frage zu stellen.)

Wenn ich diese Zeilen in meiner .htaccess -Datei verwende, funktioniert alles gut:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://example.com%{REQUEST_URI} [L,R=301]

"alles funktioniert gut" - Nun, diese Anweisungen können nur für die ersten beiden von Ihnen genannten Szenarien verantwortlich sein (dh von HTTP ):

  • http://www.example.com bis https://example.com
  • http://example.com bis https://example.com

Diese Anweisungen werden jedoch nicht von https://www (drittes Szenario) umgeleitet, wie Sie anscheinend vermuten. Sie kanonisieren die WWW-Unterdomäne nicht. Etwas anderes führt diese Umleitung durch.

Ich habe gerade die Domain durch {HTTP_Host} ersetzt. Wenn ich das tue, leitet es von http://www.example.com zu http://example.com um (da es meine Hauptdomäne ist), dann http://example.com zu https://example.com.

In Anbetracht der Anweisung, die Sie veröffentlicht haben; Dies ist unmöglich! Ihre Direktive leitet immer nur zu https weiter, daher muss "etwas anderes" die erste Weiterleitung auslösen, die Sie zu http sehen. (Aber es sollte nichts vor Ihrer .htaccess -Umleitung geschehen - außer in der Hauptserverkonfiguration oder einer anderen .htaccess -Datei, aber ich nehme an, dass sich daran nichts geändert hat?)

Es ist möglich, dass Sie eine zwischengespeicherte Umleitung sehen, aber Sie sagen, dass Sie "gerade die Domain durch {HTTP_Host} ersetzt haben", so dass diese Art von Cache ausschließt.

Wenn ich diese Zeile hinzufüge: RewriteCond %{HTTP_Host} !^www\. [NC], ändert sich nichts.

Nun, das hätte definitiv die zusätzliche Umleitung ändern müssen, die Sie oben gesehen haben (vorausgesetzt, Sie haben sie irgendwo vor der Anweisung RewriteRule hinzugefügt). Wenn dies also nichts getan hat, deutet dies weiter darauf hin, dass "etwas anderes" diese Weiterleitungen durchführt und Ihre Anweisungen möglicherweise überhaupt nicht verarbeitet werden!

Sie schlagen jedoch vor, dass diese zusätzliche Umleitung erst gestartet wird, nachdem Sie "die Domain durch {HTTP_Host} ersetzt haben" - was unmöglich zu sein scheint. Also muss sich auch etwas anderes geändert haben .


Einiges davon könnte damit erklärt werden, dass Sie diese Anweisungen in Ihrer .htaccess -Datei in die falsche Reihenfolge gebracht haben. Wenn Sie beispielsweise WordPress (oder ein anderes CMS mit einem Front-Controller-Muster ) verwendet haben und Ihre Weiterleitungen am Ende der Datei platziert haben, Für die meisten Seitenanfragen wird es nicht verarbeitet. Abhängig von Ihrer Konfiguration wird es jedoch möglicherweise weiterhin für Ihre Homepage und Ihre statischen Ressourcen verarbeitet.

Alle Weiterleitungen dieser Art müssen zu Beginn Ihres .htaccess erfolgen.

Und stellen Sie sicher, dass Sie nicht mod_alias Redirect (oder RedirectMatch) Direktiven mit mod_rewrite RewriteRule mischen. Dies kann zu unerwarteten Konflikten führen.


... wie kann ich die .htaccess -Datei so einstellen, dass die URL nicht manuell geschrieben und http://www.example.com direkt an https://example.com umgeleitet werden muss?

Nebenbei: Wenn Sie HSTS implementieren möchten, müssen Sie ironischerweise in zwei Schritten umleiten (mit HTTP_Host wie oben). Die erste Weiterleitung geht an HTTPS auf demselben Host , optional gefolgt von einer kanonischen WWW-/Nicht-WWW-Weiterleitung auf HTTPS.

Um in einer einzigen Umleitung umzuleiten, müssen Sie nicht unbedingt die Serverkonfiguration verwenden, wie @Stephen in seiner Antwort vorschlägt (obwohl dies eine Möglichkeit ist). Wenn Sie jedoch Zugriff auf die Serverkonfiguration haben, gibt es insgesamt bessere Möglichkeiten, dies mit den Containern mod_alias Redirect und <VirtualHost> zu tun (schneller und wohl "einfacher") - mod_rewrite ist überhaupt nicht erforderlich.

Sie können dies jedoch in .htaccess als einzelne Umleitung (sowohl HTTP zu HTTPS als auch www zu Nicht-www) implementieren, indem Sie Folgendes verwenden:

RewriteEngine On

RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_Host} ^www\. [NC]
RewriteCond %{HTTP_Host} ^(?:www\.)?(.+)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L]

Die obigen Zustände ... für alle Anforderungen, die entweder nicht HTTPS oder sind, wobei der angeforderte Hostname mit www. beginnt dann weiterleiten zu https://<hostname-less-www-prefix>/<URL-path>. Dadurch wird auch ein optionaler abschließender Punkt im Fall von FQDN entfernt. Die dritte Bedingung ist erforderlich, um den Hostnamen abzüglich des (optionalen) Präfixes www. zu erfassen. Dies wird in der %1 -Rückverweisung erfasst.

Beachten Sie, dass dies eine (vorübergehende) Weiterleitung ist. Ändern Sie diese Option erst in eine (permanente) 301-Weiterleitung, nachdem Sie Ihre Tests durchgeführt und bestätigt haben, dass sie ordnungsgemäß funktioniert (um Caching-Probleme bei Ihren Tests zu vermeiden).

Eine Verallgemeinerung der Anweisungen auf diese Weise ist nicht immer die beste (oder zuverlässigste) Lösung für alle Systeme.

1
MrWhite