Ich schreibe ein einfaches PHP-basiertes MVC-ish Framework. Ich möchte, dass dieses Framework in jedem Verzeichnis installiert werden kann.
Mein PHP-Skript erfasst die Anforderungs-URL und teilt sie in Segmente auf. Es macht Segment 1 zum Controller und Segment 2 zur Aktion. Das geht alles gut, wenn ich das mache:
http://www.example.com/mvc/module/test/
Es wird an die spezifische Modulsteuerung und -methode weitergeleitet. Jetzt habe ich einen Standard-Controller, den Home-Controller, der sich im Ordner home befindet.
Wenn ich jetzt direkt auf diesen Ordner zugreife http://www.example.com/mvc/home/ Es wird ein 403 verboten angezeigt, da dieser Ordner existiert, stattdessen sollte er auch zu http://www.example.com zurückkehren /mvc/index.php
Wenn ich das Framework in einem anderen Ordner installiert hätte, sagen wir, das Ordner-Framework muss zurück zu http://www.example.com/framework/index.php umgeleitet werden
Ich möchte jeden Ordner und jede PHP-Datei zurück in die index.php umleiten und alles andere so lassen, wie es ist.
Mein erstes Problem war, dass es nie in den richtigen Ordner umgeleitet wurde, immer in den Domänenstammordner.
Folgendes habe ich versucht:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
index.php
umleiten oder Sie möchten jede Anfrage an diesen bestimmten Ordner umleitenindex.php
?Antworten:
Ihre Umschreiberegel sieht fast in Ordnung aus.
Stellen Sie zunächst sicher, dass sich Ihre
.htaccess
Datei im Stammverzeichnis Ihres Dokuments befindet (am selben Ort wieindex.php
). Andernfalls wirkt sich dies nur auf den Unterordner aus, in dem sie sich befindet (und alle darin enthaltenen Unterordner - rekursiv).Nehmen Sie als Nächstes eine geringfügige Änderung an Ihrer Regel vor, damit sie ungefähr so aussieht:
Im Moment sind Sie passende gerade auf
.
dem eine Instanz von einem beliebigen Zeichen, müssen Sie zumindest ein.*
beliebige Anzahl von Instanzen von einem beliebigen Zeichen übereinstimmen.Die
$_GET['path']
Variable enthält beispielsweise die gefälschte Verzeichnisstruktur/mvc/module/test
, die Sie dann in index.php verwenden können, um den Controller und die Aktionen zu bestimmen, die Sie ausführen möchten.Wenn Sie möchten, dass der gesamte Shebang in einem Unterverzeichnis installiert wird, z. B.
/mvc/
oder/framework/
am wenigsten kompliziert, ändern Sie die Umschreiberegel geringfügig, um dies zu berücksichtigen.Stellen Sie sicher, dass Sie
index.php
sich in diesem Ordner befinden, während sich die.htaccess
Datei im Dokumentstamm befindet.Alternative zu
$_GET['path']
(aktualisiert am 18. Februar und 19. Januar)Es ist eigentlich nicht notwendig (oder auch nicht üblich), den Pfad als
$_GET
Variable festzulegen. Viele Frameworks verlassen sich darauf$_SERVER['REQUEST_URI']
, dass dieselben Informationen abgerufen werden - normalerweise, um zu bestimmen, welcher Controller verwendet werden soll -, aber das Prinzip ist genau das gleiche.Dies vereinfacht die
RewriteRule
leicht , wie Sie das nicht brauchen , erstellen Pfad Parameter (was bedeutet , dass das Original des OPRewriteRule
wird jetzt Arbeit):Es gilt jedoch weiterhin die Regel zur Installation in einem Unterverzeichnis, z
Die Flaggen:
NC
= Keine Groß- / Kleinschreibung (nicht zwischen Groß- und Kleinschreibung unterscheiden, nicht wirklich erforderlich, da das Muster keine Zeichen enthält)L
= Last (nach diesem Umschreiben wird das Umschreiben beendet, stellen Sie also sicher, dass es das Letzte in Ihrer Liste der Umschreibungen ist.)QSA
= Query String Append, nur für den Fall, dass Sie so etwas wie?like=penguins
am Ende haben, das Sie behalten und an index.php übergeben möchten.quelle
Options +Indexes
und index.php , die inDirectoryIndex
Sie könnten aufhören index.php ganz und verwenden nur/?path=$1
Dies gilt , wenn Das Umschreiben erfolgt über .htaccess und nicht über eine Anweisung vom<Directory>
Typ httpd-vhosts.conf .$_GET['path']
wennpath=whatever
er der URL etwas hinzufügt .$_GET
damit es erforderlich gewesen wäre(.*)
... es ist lustig, aber die RewriteRule, die das OP vor 6 Jahren verwendet hat, hat damals nicht für sie funktioniert - aber so wie es die MVC-Architektur getan hat Entwickelt mit PHP (wie ich im aktualisierten Bit vom 18. Februar eingegeben habe) würde es jetzt ... denke, sie waren ihrer Zeit voraus :) Benötigt/mvc/
natürlich immer noch den richtigen Pfad zum Verzeichnis.Um alles umzuleiten, was nicht existiert,
index.php
können Sie auch dieFallBackResource
Direktive verwendenErrorDocument
Dies funktioniert genauso, wie wenn Sie einen nicht vorhandenen Pfad oder eine nicht vorhandene Datei auf dem Server anfordern, die Direktive die Anforderung stillschweigend weiterleitetindex.php
.Wenn Sie alles (
including existant files or folders
) umleiten möchtenindex.php
, können Sie Folgendes verwenden:Beachten Sie, dass das Muster
^((?!index\.php).+)$
mit jedem URI übereinstimmt, außer dassindex.php
wir den Zielpfad ausgeschlossen haben, um Endlosschleifenfehler zu vermeiden.quelle
DirectoryIndex index.php
*
anstelle von+
im Muster, wenn Sie auch den Stammpfad selbst umleiten möchten.Sie können so etwas verwenden:
Dadurch wird jede Abfrage in die index.php des Stammverzeichnisses umgeleitet. Beachten Sie, dass auch Abfragen für vorhandene Dateien wie Bilder, Javascript-Dateien oder Stylesheets umgeleitet werden.
quelle
Es gibt einen "Trick" für dieses Problem , der für alle Szenarien geeignet ist, eine so offensichtliche Lösung, dass Sie ihn ausprobieren müssen, um zu glauben, dass er tatsächlich funktioniert ... :)
Hier ist es...
Grundsätzlich bitten Sie MOD_REWRITE , immer dann an
index.php
die URI-Anforderung weiterzuleiten, wenn eine Datei vorhanden ist UND immer dann, wenn die angeforderte Datei nicht vorhanden ist !Als ich den Quellcode von MOD-REWRITE untersuchte, um zu verstehen, wie es funktioniert, stellte ich fest, dass alle Überprüfungen immer nach der Überprüfung stattfinden, ob die referenzierte Datei vorhanden ist oder nicht. Erst dann
RegEx
werden die verarbeitet. Selbst wenn Ihr URI auf einen Ordner verweist, erzwingt Apache die Überprüfung der in der Konfigurationsdatei aufgeführten Indexdateien .Basierend auf dieser einfachen Entdeckung stellte sich heraus, dass eine einfache Dateiüberprüfung für alle möglichen Aufrufe ausreichen würde , sofern wir zweimal auf die Überprüfung der Dateipräsenz tippen und beide Ergebnisse an denselben Endpunkt weiterleiten, wodurch 100% der Möglichkeiten abgedeckt werden.
WICHTIG: Beachten Sie, dass kein " / " vorhanden ist
index.php
. Standardmäßig verwendet MOD_REWRITE den Ordner, der als " Basisordner " für die Weiterleitung festgelegt ist. Das Schöne daran ist, dass es nicht unbedingt der "Stammordner" der Site sein muss, damit diese Lösung fürlocalhost/
und / oder jeden Unterordner funktioniert, den Sie anwenden.Letztendlich haben einige andere Lösungen, die ich zuvor getestet habe (diejenigen, die anscheinend gut funktionierten), die PHP-Fähigkeit gebrochen, eine Datei über ihren relativen Pfad zu "benötigen", was ein Mist ist. Achtung.
Einige Leute mögen sagen, dass dies eine unelegante Lösung ist. Es mag tatsächlich sein, aber was Tests betrifft, hat diese Lösung in mehreren Szenarien, mehreren Servern, mehreren verschiedenen Apache-Versionen usw. in allen Fällen zu 100% funktioniert!
quelle
FallbackResource index.php
Leitung auf einem Mac (OS X 10.11) funktionierte, jedoch nicht unter Centos 7.5. Allerdings: Dadurch wird beispielsweiseRewriteRule
auch der Speicherort von CSS-Dateien neu geschrieben. Da ich nur PHP-Dateien umleiten musste, habe ich die Regel auf geändertRewriteRule ^(.*)php$ index.php [L,QSA]
. YMMV.RewriteRule ^(.*)\.php$ index.php [L,NE,QSA]
(für deren Funktion keine Bedingungen erforderlich sind). Heutzutage verwende ich jedoch eine kostengünstigere RegelRewriteRule ^.+$ index.php [L,NE,QSA]
:, die mit den Bedingungen kombiniert werden kannRewriteCond %{REQUEST_FILENAME} !-f
undRewriteCond %{REQUEST_FILENAME} !-d
sogarRewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)
wirklich spezifisch ist.Dumme Antwort, aber wenn Sie nicht herausfinden können, warum es nicht umleitet, überprüfen Sie, ob das Folgende für den Webordner aktiviert ist.
AllowOverride All
Auf diese Weise können Sie htaccess ausführen, das ausgeführt werden muss! (Es gibt Alternativen, aber nicht aktiviert Probleme https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride )
quelle
Vergessen Sie danach nicht, Ihr Ankertag zu Hause zu ändern
Beispiel:
quelle
Nur für den Fall, dass Sie sich immer noch gefragt haben, wie Sie alle Anforderungen umleiten sollen, entweder wenn das Verzeichnis vorhanden ist (für Kern-Framework-Ordner und -Dateien), an den Framework-Index-Handler, nachdem einige Fehler- / Erfolgsversuche gerade bemerkt haben, dass ich nur die RewriteCond in .htaccess ändern musste Datei
Die obige Bedingung besagt "nicht gefundene Dateien" und "nicht gefundene Verzeichnisse", ok, was ist, wenn Sie einfach die Zeile "nicht gefunden" (! -d) entfernen und mit etwas wie dem folgenden enden:
Es hat bei mir wie ein Zauber funktioniert
quelle