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.


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.


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 .


Siehe oben bearbeiten.
Immer

Ich wünschte, ich könnte beide Antworten als richtig einstellen.
jmucchiello
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.