Comment puis-je faire en sorte que toutes les URL passent par un seul fichier PHP?

9

Comment les systèmes MVC où les URL se trouvent sous ces formes forcent-ils toutes les demandes via un seul fichier index.php?

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

EDIT: Lorsque j'essaie les règles de réécriture ci-dessous, j'obtiens cette erreur:

[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, c'est le contenu complet de /index.php. Lorsque je supprime les règles de réécriture, il génère '/' ou '/index.php' ou j'obtiens un 404 pour autre chose.

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

RESOLU: j'ai ajouté un / devant index.php dans la règle de réécriture, puis cela a fonctionné:

RÉSOLU ENCORE: Il s'avère que le / n'était nécessaire que parce que j'utilisais 2.2.4. Lorsque je suis passé à la version 2.2.11, le / n'était plus nécessaire.

jmucchiello
la source
Quel ensemble de règles avez-vous utilisé? J'ai essayé les deux et les deux fonctionnent bien. Êtes-vous sûr d'avoir activé mod_rewrite?
Manuel Faux
Le serveur ne démarrerait pas si mod_rewrite n'était pas actif. Il s'agit d'Apache 2.2 sur WinXP si cela importe.
jmucchiello

Réponses:

12

Si vous utilisez Apache, utilisez les réécritures via mod_rewrite:

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

Cela réécrira vos URL dans »index.php? Q = foo / bar / baz« de manière transparente.

Les lignes 2. et 3. indiquent au moteur de réécriture de ne pas réécrire l'URL s'il pointe vers un fichier ou un répertoire existant. Ceci est nécessaire pour avoir accès aux vrais fichiers fournis par le serveur httpd.

Manuel Faux
la source
Voir modification ci-dessus. Erreur 400.
jmucchiello
Quelle était la demande exacte que vous avez envoyée au serveur? Votre serveur a-t-il installé mod_rewrite? Je suppose que oui, car sinon, il ne démarrera pas à cause d'une erreur de syntaxe.
Manuel Faux
La modification affiche la demande exacte: localhost: 8181 et localhost: 8181 / abc . Si je supprime les règles de réécriture, j'obtiens mon index.php avec / et un 404 normal avec / abc.
jmucchiello
J'ai ajouté un / devant index.php et cela a résolu le problème.
jmucchiello
Mystérieux ... J'ai testé sans slash et cela a fonctionné pour moi avec apache-2.2.11-8.
Manuel Faux
1

Le code ci-dessous utilise le mod_rewrite d'Apache pour réécrire toutes les URL ne pointant pas vers un fichier physique ou un répertoire à mapper sur index.php. Le résultat final sera:

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

Réécrire la règle:

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

Explication:

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

Les deux lignes ci-dessus indiquent que cette règle ne s'applique pas aux fichiers normaux (-f) ou aux répertoires (-d).

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

Pour plus d'informations sur la création de règles mod_rewrite, consultez le site Web Apache: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html .

nabrond
la source
Voir modification ci-dessus. Erreur 400.
jmucchiello
J'aimerais pouvoir définir les deux réponses comme correctes.
jmucchiello