it-swarm.com.de

Leite alles mit htaccess nach index.php um

Ich schreibe ein einfaches PHP-basiertes MVC-Framework. Ich möchte, dass dieses Framework in einem beliebigen Verzeichnis installiert werden kann.

Mein PHP Skript packt die Anfrage-URI und teilt sie in Segmente auf. Es macht Segment 1 zum Controller und Segment 2 zur Aktion.

http://www.example.com/mvc/module/test/

Es wird zu der spezifischen 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 eine 403 verboten angezeigt, da dieser Ordner existiert, stattdessen sollte er auch zurückgehen zu - http://www.example.com/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, auf das ich gestoßen bin, war, dass es nie in den richtigen Ordner umgeleitet wurde, immer in den Stammordner der Domäne.

Das habe ich versucht:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
104
David Ericsson

Ihre Umschreiberegel sieht fast in Ordnung aus.

Stellen Sie zuerst sicher, dass Ihr .htaccess Datei befindet sich in Ihrem Dokumentenstamm (derselbe Ort wie index.php) oder es wirkt sich nur auf den Unterordner aus, in dem es sich befindet (und alle darin enthaltenen Unterordner - rekursiv).

Nehmen Sie als Nächstes eine leichte Änderung an Ihrer Regel vor, sodass sie ungefähr so ​​aussieht:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

Im Moment passt du nur zu . was eine Instanz eines beliebigen Zeichens ist, benötigen Sie mindestens .* für eine beliebige Anzahl von Instanzen eines beliebigen Zeichens.

Das $_GET['path'] Variable wird die gefälschte Verzeichnisstruktur enthalten, also /mvc/module/test, mit dem Sie dann in index.php den Controller und die Aktionen bestimmen können, die Sie ausführen möchten.


Wenn Sie möchten, dass der gesamte Shebang in einem Unterverzeichnis wie /mvc/ oder /framework/ Die am wenigsten komplizierte Methode besteht darin, die Umschreiberegel leicht zu ändern, um dies zu berücksichtigen.

RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]

Und stellen Sie sicher, dass Ihr index.php befindet sich in diesem Ordner, während der .htaccess-Datei befindet sich im Dokumentenstamm.


Als Alternative $_GET['path'] (aktualisiert am 18. Februar und 19. Januar)

Es ist eigentlich nicht notwendig (und auch nicht üblich), den Pfad als $_GET Variable, viele Frameworks basieren auf $_SERVER['REQUEST_URI'], um dieselben Informationen abzurufen - normalerweise, um zu bestimmen, welcher Controller verwendet werden soll - aber das Prinzip ist genau dasselbe.

Dies vereinfacht das RewriteRule geringfügig, da Sie den Pfadparameter nicht erstellen müssen (dh das ursprüngliche RewriteRulewird jetzt funktionieren):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

Allerdings gilt weiterhin die Regel zur Installation in einem Unterverzeichnis, z.

RewriteRule ^.*$ /mvc/index.php [L,QSA]



Die Flaggen:

NC = Keine Groß-/Kleinschreibung (Groß-/Kleinschreibung wird nicht berücksichtigt, da das Muster keine Zeichen enthält)

L = Last (nach diesem Umschreiben wird das Umschreiben abgebrochen, stellen Sie also sicher, dass es das letzte in Ihrer Liste der Umschreibungen ist.)

QSA = Abfragezeichenfolge anhängen, nur für den Fall, dass Sie etwas wie ?like=penguins am Ende, das Sie behalten möchten und übergeben Sie an index.php.

219
CD001

Um alles, was nicht existiert, nach index.php Umzuleiten, können Sie auch die Direktive FallBackResource verwenden

FallbackResource /index.php

Es funktioniert genauso wie das ErrorDocument, wenn Sie einen nicht existierenden Pfad oder eine nicht existierende Datei auf dem Server anfordern, leitet die Direktive die Anforderung stillschweigend an index.php Weiter.

Wenn Sie alles (including existant files or folders) Nach index.php Umleiten möchten, können Sie Folgendes verwenden:

RewriteEngine on

RewriteRule ^((?!index\.php).+)$ /index.php [L]

Beachten Sie, dass das Muster ^((?!index\.php).+)$ mit Ausnahme von index.php Mit jedem Uri übereinstimmt. Wir haben den Zielpfad ausgeschlossen, um Endlosschleifenfehler zu vermeiden.

26
starkeen

Sie können so etwas verwenden:

RewriteEngine on
RewriteRule ^.+$ /index.php [L]

Dadurch wird jede Abfrage in die index.php des Stammverzeichnisses umgeleitet. Beachten Sie, dass Abfragen für vorhandene Dateien wie Bilder, Javascript-Dateien oder Stylesheets umgeleitet werden.

15
Technoh

Es gibt einen "Trick" für dieses Problem , der für alle Szenarien geeignet ist. Eine so offensichtliche Lösung, dass Sie es versuchen müssen, um zu glauben, dass es tatsächlich funktioniert. . :)

Hier ist es...

<IfModule mod_rewrite.c>

   RewriteEngine On

   RewriteCond %{REQUEST_FILENAME}  -f [OR]
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ index.php [L,QSA]

</IfModule>

Grundsätzlich fordern Sie MOD_REWRITE auf, die URI-Anforderung an index.php Weiterzuleiten immer, wenn eine Datei vorhanden ist UND immer, wenn die angeforderte Datei nicht vorhanden ist existieren!

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 existiert oder nicht. Erst dann werden die RegEx verarbeitet. Auch wenn Ihr URI auf einen Ordner verweist, erzwingt Apache die Überprüfung der Indexdateien , die in der Konfigurationsdatei aufgeführt sind.

Basierend auf dieser einfachen Entdeckung, die sich als offensichtlich herausstellte, würde eine einfache Dateiüberprüfung für alle möglichen Aufrufe ausreichen, sofern wir die Dateipräsenzprüfung zweimal antippen und beide Ergebnisse an denselben Endpunkt leiten, der sie abdeckt 100% der Möglichkeiten.

WICHTIG: Beachten Sie, dass index.php Kein "/" enthält. 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, sodass diese Lösung für localhost/ 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 verletzt, eine Datei über ihren relativen Pfad "anzufordern", was ein Mist ist. Achtung.

Einige Leute mögen sagen, dass dies eine unelegante Lösung ist. Es kann tatsächlich sein, aber soweit es Tests in verschiedenen Szenarien, auf verschiedenen Servern, in verschiedenen Apache-Versionen usw. gibt, hat diese Lösung in allen Fällen zu 100% funktioniert!

9
Julio Marchi

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, die aber nicht aktiviert sind, was zu Problemen führen wird https://httpd.Apache.org/docs/2.4/mod/core.html#allowoverride )

4
Antony