Wie lasse ich alle URLs durch eine einzelne PHP-Datei laufen?

9

Wie erzwingen MVC-Systeme, in denen sich die URLs in diesen Formularen befinden, alle Anforderungen über eine einzige index.php-Datei?

http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you

BEARBEITEN: Wenn ich die folgenden Umschreiberegeln versuche, wird folgende Fehlermeldung angezeigt:

[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1

EDIT: Oh, das ist der komplette Inhalt von /index.php. Wenn ich die Umschreiberegeln entferne, wird '/' oder '/index.php' ausgegeben oder ich bekomme eine 404 für irgendetwas anderes.

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>

Gelöst: Ich habe ein / vor index.php in die Umschreiberegel eingefügt und dann hat es funktioniert:

WIEDER GELÖST: Es stellte sich heraus, dass / nur benötigt wurde, weil ich 2.2.4 ausgeführt habe. Beim Upgrade auf 2.2.11 wurde / nicht mehr benötigt.

jmucchiello
quelle
Welche Regeln haben Sie angewendet? Ich habe beide ausprobiert und beide funktionieren gut. Bist du sicher, dass du mod_rewrite aktiviert hast?
Manuel Faux
Der Server würde nicht gestartet, wenn mod_rewrite nicht aktiv wäre. Dies ist Apache 2.2 unter WinXP, wenn dies wichtig ist.
jmucchiello

Antworten:

12

Wenn Sie Apache verwenden, verwenden Sie Umschreibungen über mod_rewrite:

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

Dadurch werden Ihre URLs transparent in »index.php? Q = foo / bar / baz« umgeschrieben.

Die Zeilen 2. und 3. weisen die Rewrite Engine an, die URL nicht neu zu schreiben, wenn sie auf eine vorhandene Datei oder ein vorhandenes Verzeichnis verweist. Dies ist erforderlich, um Zugriff auf echte Dateien zu haben, die vom httpd-Server bereitgestellt werden.

Manuel Faux
quelle
Siehe oben bearbeiten. Fehler 400.
jmucchiello
Was war die genaue Anfrage, die Sie an den Server gesendet haben? Ist auf Ihrem Server mod_rewrite installiert? Ich denke schon, weil es sonst wegen eines Syntaxfehlers nicht startet.
Manuel Faux
Die Bearbeitung zeigt die genaue Anfrage: localhost: 8181 und localhost: 8181 / abc . Wenn ich die Umschreiberegeln entferne, erhalte ich meine index.php mit / und eine normale 404 mit / abc.
jmucchiello
Ich habe ein / vor index.php hinzugefügt und das hat das Problem behoben.
jmucchiello
Geheimnisvoll ... Ich habe ohne den Schrägstrich getestet und es hat bei mir mit Apache-2.2.11-8 funktioniert.
Manuel Faux
1

Der folgende Code verwendet Apaches mod_rewrite, um alle URLs neu zu schreiben, die nicht auf eine physische Datei oder ein Verzeichnis verweisen, das / das index.php zugeordnet werden soll. Das Endergebnis wird sein:

http://www.example.com/index.php/foo/bar/baz
http://www.example.com/index.php/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/index.php/hey/you

Umschreiberegel:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

Erläuterung:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Beide obigen Zeilen schreiben vor, dass diese Regel nicht für reguläre Dateien (-f) oder Verzeichnisse (-d) gilt.

RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

Weitere Informationen zum Erstellen von mod_rewrite-Regeln finden Sie auf der Apache-Website: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html .

Nabrond
quelle
Siehe oben bearbeiten.
Immer
Ich wünschte, ich könnte beide Antworten als richtig einstellen.
jmucchiello