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


Comment les systèmes MVC où les URL sont-ils dans ces formulaires forcent-ils toutes les requêtes dans 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, le message d'erreur suivant s'affiche:

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

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

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

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


7
2017-07-25 15:46


origine


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. Ceci est Apache 2.2 sur WinXP si cela compte. - jmucchiello


Réponses:


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 sur »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. Cela est nécessaire pour avoir accès aux fichiers réels fournis par le serveur httpd.


8
2017-07-25 15:54



Voir éditer ci-dessus. Obtenir une erreur 400. - jmucchiello
Quelle était la demande exacte que vous avez envoyée au serveur? Est-ce que mod_rewrite est installé sur votre serveur? Je suppose que oui, car sinon, cela ne démarrera pas à cause d'une erreur de syntaxe. - Manuel Faux
L'édition montre la requête 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


Le code ci-dessous utilise mod_rewrite d'Apache pour réécrire toutes les URL ne pointant pas vers un fichier ou un répertoire physique à mapper à 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 normaux (-f) ni 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.


1
2017-07-25 16:14



Voir éditer ci-dessus. Obtenir une erreur 400. - jmucchiello
Je voudrais pouvoir définir les deux réponses comme correctes. - jmucchiello