it-swarm.com.de

Durch das Erzwingen von https werden alle Ordner umgeleitet

Ich habe eine ziemlich große Site, die aus einigen regulären Webseiten im Stammverzeichnis und vielen Joomla-Sites in Ordnern besteht.

Es sieht also ungefähr so ​​aus:

- index.php (root)
- about.php (root)
- product.php (root)
/joomlasite1
/joomlasite2
/joomlasite3

Ich habe meinen Webhost gebeten, beim Einfügen einer Umleitung in den .htaccess zu helfen, um https und www zu erzwingen. Aber als sie dies taten, leitete jede Joomla-Site zum Stammverzeichnis um, so dass ich es entfernen musste.

Dies ist die Regel, nach der sie vorgehen:

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

Kann jemand den besten Weg vorschlagen, dies zu tun? Muss ich eine Umleitung in das Stammverzeichnis und in jeden Joomla-Site-Ordner einfügen?

1
caffeinehigh

Was Sie beschreiben, klingt wie eine Standardumleitung von HTTP zu HTTPS (und von Nicht-WWW zu WWW). Es ist also nicht klar, warum die Anweisungen des Webhosts auf die von Ihnen vorgeschlagene Weise fehlgeschlagen sind.

Da Sie jedoch erwarten würden, dass jede /joomlasite -Datei eine eigene .htaccess -Datei enthält, die auch mod_rewrite-Direktiven enthält, könnte dies die Sache komplizieren. Es ist jedoch zu erwarten, dass diese Unterverzeichnisse überhaupt nicht umgeleitet werden. (Siehe unten.)

Um HTTP zu HTTPS und Nicht-WWW zu WWW umzuleiten, versuchen Sie Folgendes oben in der Datei .htaccess im Stammverzeichnis Ihrer Site:

RewriteEngine On

RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=302,L]

Stellen Sie sicher, dass Sie Ihren Browser-Cache leeren, bevor Sie den Test durchführen.

Dies setzt auch voraus, dass das SSL-Zertifikat auf Ihrem Server installiert ist und Sie keinen SSL-Front-End-Proxy zum Verwalten Ihres SSL verwenden.

Beachten Sie, dass dies eine temporäre 302-Umleitung ist. Ändern Sie sie nur in eine permanente 301-Umleitung, wenn Sie sicher sind, dass sie ordnungsgemäß funktioniert. 301s werden vom Browser hart zwischengespeichert, was das Testen problematisch machen kann.


PDATE: Wenn Sie eine allgemeinere Lösung ohne Hardcodierung der Domain suchen, können Sie stattdessen Folgendes tun:

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

Dies ist dem oben beschriebenen sehr ähnlich, mit Ausnahme einer zusätzlichen Anweisung RewriteCond, die erforderlich ist, um den Domänen-Apex aus dem Header Host zu erfassen.

Eine generische Lösung ist nicht unbedingt die "beste Lösung". (Auch wenn dies der Fall sein mag.) In der unendlichen Welt der unterschiedlichen Serverkonfigurationen ist die Hardcodierung des Domänennamens häufig die zuverlässigste Lösung.


Dies kann jedoch möglicherweise nichts für die Unterverzeichnisse bewirken, die ihre eigenen .htaccess -Dateien enthalten (wenn diese Dateien auch mod_rewrite-Direktiven enthalten). In diesem Fall müssen Sie entweder die obigen Anweisungen in der .htaccess -Datei jedes Unterverzeichnisses wiederholen oder die mod_rewrite-Vererbung aktivieren, indem Sie die folgende Anweisung in die .htaccess -Datei jedes Unterverzeichnisses einfügen:

RewriteOptions InheritBefore

In Apache 2.4.8+ können Sie stattdessen die folgende Anweisung nur in die Datei root .htaccess einfügen:

RewriteOptions InheritDownBefore

Ob die Vererbung von mod_rewrite erfolgreich ist, ohne vorhandene Anweisungen zu ändern, hängt jedoch davon ab, welche anderen Anweisungen in der übergeordneten .htaccess -Datei enthalten sind.

die Vererbung von mod_rewrite ist nicht trivial. Direktiven werden buchstäblich direkt kopiert. Wenn Sie also verzeichnisbezogene Anweisungen haben, die vom relativen Dateipfad abhängen, können diese fehlerhaft sein. (Dies ist in erster Linie der Grund, warum ich in der obigen Anweisung REQUEST_URI verwendet habe, anstatt den URL-Pfad aus dem RewriteRule -Muster .) Die einfachste Lösung - ohne mehr über Ihr System zu wissen - besteht möglicherweise darin, die Umleitungsdirektiven (oben) einfach in jede untergeordnete .htaccess -Datei zu kopieren.


PDATE:

Dies ist die Regel, nach der sie vorgehen:

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

Wenn diese Anweisungen in der Datei .htaccess im Dokumentstamm Ihrer Site verwendet würden und die Vererbung von mod_rewrite ebenfalls aktiviert wäre (wie oben beschrieben), würde dies in der Tat das Verhalten zeigen, das Sie gesehen haben, d. H. alles in /joomlasite wird zum root umgeleitet. z.B. http://www.example.com/joomlasite/foo wird im Stammverzeichnis zu https://www.example.com/foo umgeleitet - das Verzeichnis /joomlasite ist praktisch "verloren".

Dies liegt daran, dass die geerbten Anweisungen direkt kopiert werden (wie oben erwähnt). Wenn diese Anweisungen im Kontext der Datei .htaccess im Unterverzeichnis /joomlasite ausgeführt werden, wird der URL-Pfad vom Muster RewriteRule (und später in der $1 -Rückverweisung verwendet) wäre foo, nicht joomlasite/foo, da sich das Verzeichnispräfix (von wo die .htaccess -Datei befindet gefunden) wird zuerst aus dem URL-Pfad entfernt. Dies führt dann zu einer Ersetzung der Form https://www.example.com/foo.

Die Anweisungen, die ich zuvor gepostet habe und die REQUEST_URI anstelle von $1 verwenden, umgehen dieses Problem, da REQUEST_URI immer den vollständigen URL-Pfad der Anforderung enthält.

2
MrWhite

Vielen Dank für die ausführliche Erklärung @MrWhite. Ich habe eine Frage. Als ich versuchte, Ihren Code zu implementieren, erhielt ich eine Endlosumleitungsschleife. Ich habe mir Alternativen angesehen und diese unten hat funktioniert. Nur neugierig, warum sich die beiden unterscheiden würden? Gibt es eine Art Serverkonfiguration, die es verursachen würde?

RewriteEngine On


# Redirect HTTP with www to HTTPS with www
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_Host} ^www\. [NC]
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [R=302,L]
# Redirect HTTP without www to HTTPS with www
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_Host}%{REQUEST_URI} [R=302,L]
# Redirect HTTPS without www to HTTPS with www
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_Host}%{REQUEST_URI} [R=302,L]
0
caffeinehigh