Rewriting Rule sur paramètres GET

Fermé
Anoen Messages postés 196 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 - 15 nov. 2011 à 21:05
maka54 Messages postés 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 - 29 nov. 2011 à 08:07
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.

A voir également:

5 réponses

Anoen Messages postés 196 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 25
18 nov. 2011 à 11:38
Un petit up pour ne pas sombrer dans l'oubli
0
maka54 Messages postés 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
18 nov. 2011 à 14:22
bonjour,

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
0
Anoen Messages postés 196 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 25
18 nov. 2011 à 14:59
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.
0
maka54 Messages postés 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
18 nov. 2011 à 16:12
en faisant :

$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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Anoen Messages postés 196 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 25
18 nov. 2011 à 16:49
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/
0
maka54 Messages postés 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
Modifié par maka54 le 18/11/2011 à 17:17
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

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]
...
0
Anoen Messages postés 196 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 25
18 nov. 2011 à 17:42
Je me répète, avec ta solution j'ai cette url: http://anoen.local/index/action/foo/
Je cherche à afficher une url telle que : http://anoen.local/foo/
0
maka54 Messages postés 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
18 nov. 2011 à 17:51
jusqu'a preuve du contraire, mon exemple n'écrit pas ton url à ta place, donc à toi d'écrire ton url convenablement

moi je te donne la manière de récupérer les paramètres sous cette forme :
http://anoen.local/foo/
0
Anoen Messages postés 196 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 11 septembre 2013 25
22 nov. 2011 à 19:25
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.
0
maka54 Messages postés 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
22 nov. 2011 à 19:39
index action et foo, ce sont des repertoires ?
0