Rewriting Rule sur paramètres GET
Anoen
Messages postés
196
Date d'inscription
Statut
Membre
Dernière intervention
-
maka54 Messages postés 698 Date d'inscription Statut Membre Dernière intervention -
maka54 Messages postés 698 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai besoin de votre aide sur le fonctionnement de l'URL rewriting. Ca fait djà quelques années que je suis dans le web mais jamais touché aux réécritures d'url autrement que dans les frameworks ou CMS. Maintenant que j'ai fait mon petit framework maison, il me manque plus que cette brique pour que tout fonctionne à merveille.
Je précise que j'ai déjà lu beaucoup de doc là dessus mais je parviens pas à capter la logique de ce truc.. bref.
J'ai donc une url de type http://anoen.local/index.php?action=foo
que j'aimerais réécrire en http://anoen.local/foo/
Donc garder uniquement la valeur du paramètre.
Tout ce que j'ai essayé à présent me donne http://anoen.local/index/action/foo
et ça c'est pas top...
Est-ce que quelqu'un pourrait m'orienter ?
Merci.
J'ai besoin de votre aide sur le fonctionnement de l'URL rewriting. Ca fait djà quelques années que je suis dans le web mais jamais touché aux réécritures d'url autrement que dans les frameworks ou CMS. Maintenant que j'ai fait mon petit framework maison, il me manque plus que cette brique pour que tout fonctionne à merveille.
Je précise que j'ai déjà lu beaucoup de doc là dessus mais je parviens pas à capter la logique de ce truc.. bref.
J'ai donc une url de type http://anoen.local/index.php?action=foo
que j'aimerais réécrire en http://anoen.local/foo/
Donc garder uniquement la valeur du paramètre.
Tout ce que j'ai essayé à présent me donne http://anoen.local/index/action/foo
et ça c'est pas top...
Est-ce que quelqu'un pourrait m'orienter ?
Merci.
A voir également:
- Rewriting Rule sur paramètres GET
- Parametres de mon ordinateur - Guide
- Paramètres dns - Guide
- Get data back - Télécharger - Récupération de données
- Paramètres de confidentialité - Guide
- Leboncoin paramètres - Guide
5 réponses
bonjour,
voici une piste
fichier htaccess :
finchier index.php
$get sera un tableau des paramètres passés - separés par des slash dans l'url
----------------------
par contre, la réécriture d'URL avec des slash comporte des soucis, au niveau des fichiers css et javascript
voici une solution pour pallier aux problèmes
tu definit le chemin absolu de ta page index.php , puis tu appelles les fichiers js et css avec leur chemin absolu
voici une piste
fichier htaccess :
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?get=$1 [L]
finchier index.php
$get = explode('/', $_GET['get']);
$get sera un tableau des paramètres passés - separés par des slash dans l'url
----------------------
par contre, la réécriture d'URL avec des slash comporte des soucis, au niveau des fichiers css et javascript
voici une solution pour pallier aux problèmes
<?php DEFINE ("CHEMIN", substr($_SERVER['PHP_SELF'],0,strrpos($_SERVER['PHP_SELF'], '/'))); ?> <head> <base href="<?php echo CHEMIN;?>"> <link rel="stylesheet" type="text/css" href="<?php echo CHEMIN;?>/style.css" > <script src="<?php echo CHEMIN;?>/script.js" type="text/javascript"></script> </head>
tu definit le chemin absolu de ta page index.php , puis tu appelles les fichiers js et css avec leur chemin absolu
Merci de ta réponse,
Le problème reste le même, au lieu d'avoir une url http://anoen.local/foo/ j'ai http://anoen.local/index/action/foo/
J'ai déjà un tableau des valeurs de mes paramètres qui est renvoyé au controller pour le dispatch. En revanche dans la piste que tu donnes je ne vois pas à quoi il sert par la suite.
Ma base url est déjà set également, c'est surtout les rewrite rule dans le htaccess qui me piquent un peu.
Le problème reste le même, au lieu d'avoir une url http://anoen.local/foo/ j'ai http://anoen.local/index/action/foo/
J'ai déjà un tableau des valeurs de mes paramètres qui est renvoyé au controller pour le dispatch. En revanche dans la piste que tu donnes je ne vois pas à quoi il sert par la suite.
Ma base url est déjà set également, c'est surtout les rewrite rule dans le htaccess qui me piquent un peu.
en faisant :
çà fonctionnera
concernant les rewriteCond, je vais t'éclairer
RewriteCond %{REQUEST_FILENAME} !-f
cette ligne signifie pas de règle si c'est un fichier
RewriteCond %{REQUEST_FILENAME} !-d
cette ligne signifie pas de règle si c'est un directory
$get = explode('/', $_GET['get']); $action = $get[0];
çà fonctionnera
concernant les rewriteCond, je vais t'éclairer
RewriteCond %{REQUEST_FILENAME} !-f
cette ligne signifie pas de règle si c'est un fichier
RewriteCond %{REQUEST_FILENAME} !-d
cette ligne signifie pas de règle si c'est un directory
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je suis encore plus perdue avec ce $get.
Mon arborescence est construite autour de mon controller et pas autour des dossiers physiques. J'ai donc :
index.php => appelle le MainController.php
MainController.php => demande s'il y a des paramètres dans l'url à URLData.php
MainController.php => Appelle le bon template en fonction de ce qu'il trouve dans $_GET['action'] (chez moi $action = $_GET['action'] en très simple)
Rien de compliqué quoi. Donc tout s'articule autour d'une url type http://anoen.local/index.php?action=foo
Là où je ne te suis pas c'est qu'on dégage des / qui n'existeront jamais dans $action (ou même dans $get ou $_GET['get']) et on l'assigne à $action qui contient déjà tout ce que je récupère en $_GET.
Les RewriteCond sont ok dans ma tête, la logique et syntaxe des Rewrite Rules en revanche... besoin d'aide pour ça.
Bref, tout ça pour dire que ça me génère toujours une url http://anoen.local/index/action/foo/
Mon arborescence est construite autour de mon controller et pas autour des dossiers physiques. J'ai donc :
index.php => appelle le MainController.php
MainController.php => demande s'il y a des paramètres dans l'url à URLData.php
MainController.php => Appelle le bon template en fonction de ce qu'il trouve dans $_GET['action'] (chez moi $action = $_GET['action'] en très simple)
Rien de compliqué quoi. Donc tout s'articule autour d'une url type http://anoen.local/index.php?action=foo
Là où je ne te suis pas c'est qu'on dégage des / qui n'existeront jamais dans $action (ou même dans $get ou $_GET['get']) et on l'assigne à $action qui contient déjà tout ce que je récupère en $_GET.
Les RewriteCond sont ok dans ma tête, la logique et syntaxe des Rewrite Rules en revanche... besoin d'aide pour ça.
Bref, tout ça pour dire que ça me génère toujours une url http://anoen.local/index/action/foo/
l'exemple que je te donne te permet de mettre autant de parametres que tu souhaite, autrement dis autant de $_GET['..'];
apparement çà te plait pas, je vais te donner une autre solution en t'expliquant pourquoi elle n'est pas bonne
cette règle te permet de récupérer ton $_GEt['action']
maintenant si tu veux faire de l'url rewriting, tu n'auras pas toujours qu' un seul paramètre, donc cette solution ne marchera plus
pour aller plus loin, je vais te montrer un exempe
en rewriting cela donnerais
et ton url réécrite donneras
çà marchera très bien
maintenant, tu veux faire pareil avec forum puis catégorie puis ...,
tu vas écrire autant de RewriteRule que de type d'url dans ton projet
à la longue, çà sera plutot casse-c....
je remet la solution que je t'ai proposé :
Avec ce code, tu passeras n'importe quelle URL que tu souhaites, avec n'importe quel parametres
Charge à ton MainController.php de faire le boulot
au lieu de faire $_GEt['action'], tu feras $get[0]
si tu passes d'autre infos ce sera
$get[1]
$get[2]
...
apparement çà te plait pas, je vais te donner une autre solution en t'expliquant pourquoi elle n'est pas bonne
RewriteRule ^([a-z]+)$ index.php?action=$1 [L]
cette règle te permet de récupérer ton $_GEt['action']
maintenant si tu veux faire de l'url rewriting, tu n'auras pas toujours qu' un seul paramètre, donc cette solution ne marchera plus
pour aller plus loin, je vais te montrer un exempe
index.php?action=article&id=124&page=2
en rewriting cela donnerais
RewriteRule ^([a-z]+)/?([0-9]*)/?([0-9]*)$ index.php?action=$1&id=$2&page=$3 [L]
et ton url réécrite donneras
http://exemple.net/article/124/2
çà marchera très bien
maintenant, tu veux faire pareil avec forum puis catégorie puis ...,
tu vas écrire autant de RewriteRule que de type d'url dans ton projet
à la longue, çà sera plutot casse-c....
je remet la solution que je t'ai proposé :
fichier htaccess : RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?get=$1 [L] finchier index.php $get = explode('/', $_GET['get']);
Avec ce code, tu passeras n'importe quelle URL que tu souhaites, avec n'importe quel parametres
Charge à ton MainController.php de faire le boulot
au lieu de faire $_GEt['action'], tu feras $get[0]
si tu passes d'autre infos ce sera
$get[1]
$get[2]
...
Alors, je suis partie sur ceci pour tester :
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z]+)\.html$ index.php?action=$1 [L]
D'après ce que j'ai compris, je devrais pouvoir accéder à ma page avec http://anoen.local/foo.html
Mais ce n'est toujours pas le cas, uniquement avec http://anoen.local/index/action/foo/
Est-ce que le fait que je passe par un vhost a une incidence là dessus ? Tout ce que j'ai vu dans la doc apache était que le RewriteEngine On devait se trouver dans la déclaration du vhost.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z]+)\.html$ index.php?action=$1 [L]
D'après ce que j'ai compris, je devrais pouvoir accéder à ma page avec http://anoen.local/foo.html
Mais ce n'est toujours pas le cas, uniquement avec http://anoen.local/index/action/foo/
Est-ce que le fait que je passe par un vhost a une incidence là dessus ? Tout ce que j'ai vu dans la doc apache était que le RewriteEngine On devait se trouver dans la déclaration du vhost.