Website: example.com
Joomla-Unterverzeichnis: example.com/joomla
Ich möchte, dass die Joomla-Installation unter example.com/joomla die Stammadresse der Site ist (oder als solche erscheint)., d. h. Personen, die example.com besuchen, werden zu example.com/joompla/index.php umgeleitet, sehen aber weiterhin example.com in der URL-Leiste.Ich möchte diese Gelegenheit auch nutzen, um alle eingehenden Verbindungen zur Verwendung von HTTPS zu zwingen. Mit Skripten, die ich online gefunden habe, konnte ich das eine oder das andere erledigen, aber nicht beides konsistent.
Folgendes habe ich bisher für .htaccess:
RewriteEngine on
RewriteBase /
# Rewrites all URLS without joomla in them
RewriteCond %{REQUEST_URI} !^/joomla/
# Rewrites all URLS with example in them
RewriteCond %{HTTP_HOST} ^(www\.)?example\.
# Rewrite all those to insert /joomla
RewriteRule ^(.*)$ /joomla/$1 [L]
# This works SOME of the time to redirect to https
Header always set Content-Security-Policy "upgrade-insecure-requests;"
# If a request tries to access /joomla directly, redirect it to its secured canonical version
RewriteCond %{THE_REQUEST} joomla/
RewriteRule ^joomla/(.*) http://example.com/$1 [R=301,L]
Dies scheint in Chrome manchmal zu funktionieren, indem zur Joomla-Installation umgeleitet und auf https umgeschaltet wird, aber manchmal muss ich wiederholt ein hartes Neuladen erzwingen, um dorthin zu gelangen. In Firefox funktioniert es NIE und bleibt bei http, in den seltenen Fällen, in denen die Site überhaupt geladen wird.
Ich bin ein Neuling in Sachen .htaccess und bin mir nicht sicher, ob ich die eleganteste oder umfassendste Lösung für das obige Problem entwickelt habe. Ich habe online andere Beispiele gesehen, die verschiedene Befehle verwenden RewriteCond %{HTTPS} !=on
oder mit ihnen kombinieren , aber ich bin mir nicht sicher, wie ich diese Befehle mit den vorhandenen URL-Umschreibbedingungen kombinieren soll, und daher bin ich mir sicher, dass mir die Randszenarien entgehen.RewriteCond %{SERVER_PORT} 80
RewriteRule
Kann mich jemand mit mehr Erfahrung dabei anleiten? Ich wäre sehr dankbar. Ich habe seit einigen Tagen verschiedene Skriptvarianten aus dem Internet ausprobiert, aber noch nicht die Zauberworte gefunden.
Antwort1
Einige Anmerkungen zu Ihren bestehenden Richtlinien:
UmschreibenBase /
Obwohl Sie das definiert haben RewriteBase
, wird es in keiner Ihrer Anweisungen verwendet. Das RewriteBase
gilt nur für relative PfadeSubstitutionen(Sie haben in den entsprechenden Anweisungen ausdrücklich einen stammrelativen URL-Pfad verwendet).
# Rewrites all URLS with example in them RewriteCond %{HTTP_HOST} ^(www\.)?example\.
Tust dubrauchenum den angeforderten Hostnamen zu überprüfen? Sofern Sie nicht mehrere Domänen (oder Subdomänen) hosten, auf die Sie diese Regel nicht anwenden möchten,Zustandist überflüssig.
# This works SOME of the time to redirect to https Header always set Content-Security-Policy "upgrade-insecure-requests;"
Dasniemalslöst eine „Umleitung“ aus, daher bin ich nicht sicher, was Sie im Netzwerkverkehr sehen?
(Tatsächlich gibt es in dem von Ihnen geposteten Code nichts, was eine „Umleitung“ von HTTP zu HTTPS auslösen würde.)
Dieser HTTP-Antwortheader veranlasst den Browser, alle Anfragen fürVerlinkte Ressourcen(CSS, JS, Bilder, externe Ressourcen usw.) von der ursprünglichen HTML-Antwort (Seite), die sonst über HTTP laufen würde (z. B. weil die eigentliche URL enthält http://...
), auf HTTPS. Es erfolgt keine tatsächliche „Umleitung“. Und mit der ursprünglichen HTML-Antwort, die möglicherweise über einfaches HTTP gelaufen wäre, passiert nichts.
Dieser Header ist nicht unbedingt erforderlich, wenn Sie eine Site-weite HTTP-zu-HTTPS-Umleitung implementiert haben und alle Ihre verknüpften Ressourcen bereits HTTPS sind oder eine root-relative (oder protokollrelative) URL verwenden. Er bietet jedoch ein gutes Sicherheitsnetz. Beachten Sie jedoch, dass alle verknüpften Ressourcen, die HTTPS nicht unterstützen, einfach abstürzen – ohne Browserwarnung für den Benutzer. Ohne diesen Header erhält der Benutzer möglicherweise eine Browserwarnung „gemischter Inhalt“ (und die verknüpfte Ressource schlägt fehl).
# If a request tries to access /joomla directly, redirect it to its secured canonical version RewriteCond %{THE_REQUEST} joomla/ RewriteRule ^joomla/(.*) http://example.com/$1 [R=301,L]
Die RewriteCond
Direktive (die dazu dient, eine Umleitungsschleife unter „normalen Bedingungen“ zu verhindern) stimmt joomla/
überall in der angeforderten URL überein, sogar in der Abfragezeichenfolge – was falsch ist und möglicherweise zu falschen Umleitungen führen könnte, wenn sie joomla/
an einer anderen Stelle im URL-Pfad oder sogar in der Abfragezeichenfolge erscheinen sollte. Dies würde beispielsweise zu einer Umleitungsschleife führen, wenn ich sie einfach ?joomla/
an das Ende einer beliebigen URL anhänge.
Diese "Umleitung" sollteVordie internen Umschreibungen. Im Allgemeinen sollten „Umleitungen“ vor „Umschreibungen“ stehen, um zu vermeiden, dass eine umgeschriebene URL umgeleitet wird und Ihren Benutzern die umgeschriebene URL angezeigt wird.
Wie in den Kommentaren angemerkt, erfolgt diese Weiterleitung zu HTTP – also das Gegenteil von dem, was Sie versuchen (und führt zu einer kleinen Weiterleitungskette, wenn eine Weiterleitung von HTTP zu HTTPS implementiert wird).
Einige Annahmen:
- Das SSL-Zertifikat wird direkt auf dem Anwendungsserver installiert, d. h. kein Cloudflare (Flexible-SSL) oder anderer Front-End-Proxy, der das SSL verwaltet.
- Sie verwenden keine anderen Subdomains. Nur
www
. - Der kanonische Hostname ist nicht www, d. h.
example.com
(aus der Weiterleitung in Ihrer Frage). - Sie implementieren derzeit kein HSTS, daher können Sie
example.com
in einer einzigen Weiterleitung auf HTTPS und den kanonischen Hostnamen (z. B. ) weiterleiten. - Joomla selbst wurde bereits so konfiguriert, dass das
/joomla
Unterverzeichnis aus den URLs weggelassen wird./joomla
ist in keinem internen Link vorhanden, einschließlich Links zu statischen Ressourcen (CSS, JS, Bilder usw.). - Sie stellen keine Dateien aus dem Dokumentstamm bereit.Allesbesteht darin, in das Unterverzeichnis zu gehen
/joomla
.
Szenario Nr. 1 – Eine einzelne .htaccess
Datei im Dokumentstammverzeichnis.
(Wie in den Kommentaren angegeben.)
In diesem Szenario gibt es .htaccess
im Installationsunterverzeichnis ( /joomla
) keine „Joomla“-Datei, in der Ihre URLs an den Joomla-Front-Controller (d. h. index.php
) weitergeleitet werden können. In diesem Fall index.php
muss in der URL vorhanden sein und Sie können die „SEF“-URLs von Joomla nicht verwenden.
Die Stammdatei /.htaccess
würde ungefähr so aussehen:
RewriteEngine on
RewriteBase /joomla
# If a request tries to access /joomla directly, redirect it to its secured canonical
RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\s/joomla
RewriteRule ^joomla(?:$|/(.*)) https://example.com/$1 [R=302,L]
# Canonicalise the hostname - ie. www to non-www and HTTPS
RewriteCond %{HTTP_HOST} ^www\.(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L]
# Redirect remaining requests from HTTP to HTTPS
# The hostname must already be canonical at this point
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]
# Rewrite everything to the /joomla subdirectory
# Uses the value defined in the RewriteBase directive above
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) $1 [L]
# Ensure that any linked resources are requested over HTTPS
Header always set Content-Security-Policy "upgrade-insecure-requests;"
Beachten Sie, dass ich hier zu Testzwecken 302-Weiterleitungen (temporär) verwendet habe. Testen Sie immer zuerst mit 302-Weiterleitungen und wechseln Sie erst dann zu 301 (permanent), wenn bestätigt wurde, dass es einwandfrei funktioniert. 301-Weiterleitungen werden vom Browser dauerhaft zwischengespeichert, was das Testen problematisch machen kann.
Die REDIRECT_STATUS
Umgebungsvariable wird verwendet, um sicherzustellen, dass wir nur direkte Anfragen und keine umgeschriebenen Anfragen umschreiben. Dies THE_REQUEST
geschieht auf die gleiche Weise wie in der ersten Regel. REDIRECT_STATUS
ist bei der ersten Anfrage leer und wird nach dem ersten erfolgreichen Umschreiben auf „200“ gesetzt (wie beim HTTP-Antwortstatus 200 OK). Die Direktive RewriteRule (.*) $1 [L]
sieht auf den ersten Blick vielleicht etwas seltsam aus (es sieht so aus, als würde sie sich selbst umschreiben), aber RewriteBase
der resultierenden Ersetzung wird das vorangestellt, sodass sie tatsächlich in umschreibt /joomla/<url>
.
Szenario Nr. 2 – Zwei .htaccess
Dateien: Dokumentstammverzeichnis und Unterverzeichnis
Die .htaccess
Datei im /joomla
Unterverzeichnis wäre die Standarddatei .htaccess
, die mit Joomla geliefert wird. Diese leitet alle Anfragen an den Joomla-Front-Controller weiter (d. h. index.php
) und ermöglicht die Verwendung der „SEF“-URLs von Joomla (d. h. Sie müssen sie nicht explizit index.php
in die URL aufnehmen).
Die Stammdatei /.htaccess
würde ungefähr so aussehen:
RewriteEngine on
RewriteBase /joomla
# Canonicalise the hostname - ie. www to non-www and HTTPS
RewriteCond %{HTTP_HOST} ^www\.(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L]
# Redirect remaining requests from HTTP to HTTPS
# The hostname must already be canonical at this point
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]
# Rewrite everything to the /joomla subdirectory
# Uses the value defined in the RewriteBase directive above
RewriteRule (.*) $1 [L]
# Ensure that any linked resources are requested over HTTPS
Header always set Content-Security-Policy "upgrade-insecure-requests;"
Beachten Sie, dass die Weiterleitung zum Entfernen des /joomla
Unterverzeichnisses aus der URL entfernt wurde und in die /joomla/.htaccess
Datei eingefügt werden muss. (Sie wäre völlig überflüssig, wenn sie hier gelassen würde.)
REDIRECT_STATUS
Sie brauchen die Prüfung der Umgebungsvariable dieses Mal nicht, da der /joomla/.htaccess
Willefangendie Anfrage, nachdem sie neu geschrieben wurde. (Vorausgesetzt, die mod_rewrite-Vererbung wurde nicht aktiviert.)
Die Direktive könnte bei Bedarf Header
dorthin verschoben werden – dies ist optional, da sie ohnehin „geerbt“ wird./joomla/.htaccess
Die Datei würde dann /joomla/.htaccess
etwa Folgendes enthalten:
# JOOMLA: Set Options here
RewriteEngine on
# If a request tries to access here directly then redirect back to root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) https://example.com/$1 [R=302,L]
# JOOMLA: Rewrite rules to block out some common exploits.
# :
# Leave the RewriteBase directive commented out - it's not required
#RewriteBase /joomla
## Begin - Joomla! core SEF Section.
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
## End - Joomla! core SEF Section.
Die /joomla/.htaccess
Datei basiert lose aufder Code auf der Joomla-Website, ich habe jedoch die gemeinsamen Elemente/Kommentare weggelassen und den „SEF-Abschnitt“ so geändert, dass er für das Unterverzeichnis relevant ist. (Joomla verwendet auch einen weniger effizienten regulären Ausdruck .*
anstelle von einfach ^
.)