10 votes

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

Comment les systèmes MVC où les urls sont dans ces formulaires forcent toutes les requêtes à passer par 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 j'enlève les règles de réécriture, il sort '/' ou '/index.php' ou j'obtiens un 404 pour toute autre chose.

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

SOLUTION : J'ai ajouté un / devant index.php dans la règle de réécriture et cela a fonctionné :

SOLUTION : Il s'avère que le / n'était nécessaire que parce que j'utilisais la version 2.2.4. Quand j'ai fait la mise à jour vers la 2.2.11, le / n'était plus nécessaire.

0 votes

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é le mod_rewrite ?

0 votes

Le serveur ne démarrerait pas si le mod_rewrite n'était pas actif. Il s'agit d'Apache 2.2 sur WinXP, si cela a de l'importance.

13voto

Manuel Faux Points 497

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 en "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 si elle pointe vers un fichier ou un répertoire existant. Ceci est nécessaire pour avoir accès aux fichiers réels fournis par le serveur httpd.

0 votes

Voir l'édition ci-dessus. J'obtiens l'erreur 400.

0 votes

Quelle est la requête exacte que vous avez envoyée au serveur ? Le mod_rewrite est-il installé sur votre serveur ? Je suppose que oui, car sinon il ne démarrera pas à cause d'une erreur de syntaxe.

0 votes

L'édition montre la demande exacte : localhost:8181 y localhost:8181/abc . Si je supprime les règles de réécriture, j'obtiens mon index.php avec / et un 404 normal avec /abc.

2voto

nabrond Points 631

Le code ci-dessous utilise le mod_rewrite d'Apache pour réécrire toutes les URL qui ne pointent pas vers un fichier ou un répertoire physique afin de les faire correspondre à 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ègle de réécriture :

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 ordinaires (-f) ou aux répertoires (-d).

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

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

0 votes

Voir l'édition ci-dessus. J'obtiens l'erreur 400.

0 votes

J'aimerais pouvoir définir les deux réponses comme correctes.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X