Réécriture en boucle partielle.

Consultez la formation URL Rewriting et sites dynamiques de WebRankInfo / Ranking Metrics

HyWaN
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 14
Inscription: 4 Juil 2005

Réécriture en boucle partielle.

Message le Lun Mar 17, 2008 17:09

Bonjour :)

J'aimerais savoir si c'est possible d'avoir le comportement suivant avec le moteur de réécriture d'URL d'Apache (1 si possible, 2 sinon) :
Code: Tout sélectionner
/module/action/param1-value1/param2-value2/.../paramn-valuen/

?module=<module>&action=<action>&<param1>=<value1>&<param2>=<value2>&...&<paramn>=<valuen>

Je parle de boucle partielle car le début est fixé (module et action), on extrait ensuite n paramètres avec n valeurs par la suite, c'est à ce moment que je pensais utiliser une boucle.

Merci :).

Vap
WRInaute passionné
WRInaute passionné
 
Messages: 1090
Inscription: 17 Juin 2007

Re: Réécriture en boucle partielle.

Message le Lun Mar 17, 2008 18:03

HyWaN a écrit:Bonjour :)

J'aimerais savoir si c'est possible d'avoir le comportement suivant avec le moteur de réécriture d'URL d'Apache (1 si possible, 2 sinon) :
Code: Tout sélectionner
/module/action/param1-value1/param2-value2/.../paramn-valuen/

?module=<module>&action=<action>&<param1>=<value1>&<param2>=<value2>&...&<paramn>=<valuen>

Je parle de boucle partielle car le début est fixé (module et action), on extrait ensuite n paramètres avec n valeurs par la suite, c'est à ce moment que je pensais utiliser une boucle.

Merci :).


Je ne sais pas encore, j'ai peut etre un idée mais il faut que je teste. Par contre, si tu utilise / comme séparateur, il faut que les répertoires existent réellement... En effet Apache va chercher s'il y a un .htaccess dedans.

Vap
WRInaute passionné
WRInaute passionné
 
Messages: 1090
Inscription: 17 Juin 2007

Message le Lun Mar 17, 2008 18:25

J'ai testé en local ce qui suit. Tu dois pouvoir l'étendre pour couvrir tes besoins. Pour faire une boucle, je passe par une redirection externe.

Code: Tout sélectionner
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/(.*)-(.*)/$ http://localhost/$1?$2=$3&%1 [R=301]


Par exemple, -http://localhost/module1/par1-val1/par2-val2 est réécrit en -http://localhost/module1/?par1=val1&par2=val2 avec cette règle.

HyWaN
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 14
Inscription: 4 Juil 2005

Message le Lun Mar 17, 2008 23:17

Bonsoir :),

en fait ce n'est pas exactement mon problème. C'est un peu plus compliqué que ça en réalité.
Voilà, je vais montrer à partir d'exemples.
Code: Tout sélectionner
soit
http://localhost/litterature/papier/format-b5/autre-blabla/../parn-valn/

qui deviendrait :
http://localhost/index.php?module=litterature&action=papier&format=b5&autre=blabla&..&parn=valn


Voilà où j'en suis exactement. Un ami est venu à mon aide, et il a trouvé ceci :
Code: Tout sélectionner
RewriteEngine On
RewriteBase /test_rewrite/

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([a-z]+)-([a-z]+)/(.+?/)?index.php $3index.php?%1&$1=$2 [N,NC]

RewriteRule ^([a-z]+)/([a-z]+)/(.*?/)? $3index.php?module=$1&action=$2 [N,NC]
RewriteRule ^([a-z]+)/(.*?/)? $2index.php?module=$1 [N,NC]

ça fonctionne mais pas jusqu'au bout. Je m'explique. Voici une page de test :
Code: Tout sélectionner
<?php

header('Content-type: text/plain');

print_r($_GET);
echo getcwd() . "\n";
echo __FILE__;

Voici les résultats :
Code: Tout sélectionner
http://localhost/test_rewrite/AA/
Array
(
    [module] => AA
)
// je passe les valeurs de getcwd et __FILE__ elles sont correctes, à savoir qu'on est bien sur l'index.

http://localhost/test_rewrite/AA/BB/
Array
(
    [module] => AA
    [action] => BB
)

http://localhost/test_rewrite/AA/BB/a-b/
Array
(
    [module] => AA
    [action] => BB
    [a] => b
)

http://localhost/test_rewrite/AA/BB/a-b/c-d/
Array
(
    [module] => AA
    [action] => BB
    [a] => b
)
// rien de plus, il ne considère pas c-d

// il ne considère plus rien par là suite.

En gros, on est bloqué ;-).

Est-ce que le fait d'avoir les logs serait utile ?

Merci :).

Vap
WRInaute passionné
WRInaute passionné
 
Messages: 1090
Inscription: 17 Juin 2007

Message le Mar Mar 18, 2008 8:31

Justement, ce que je te donne permet de compléter ce que tu as déjà. J'avais bien compris ton problème....

Ce qui te manque, c'est de pouvoir boucler sur les sous répertoires, et c'est ce que j'ai expliqué.

Je vais produire les règles qu'il te faut quand j'aurai accès a mon environnement de test.

Vap
WRInaute passionné
WRInaute passionné
 
Messages: 1090
Inscription: 17 Juin 2007

Message le Mar Mar 18, 2008 22:48

Les règles suivantes ont l'air de faire ce que tu veux (testé en local):

Code: Tout sélectionner
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/([^/]+)-([^/]+)/$ http://localhost/$1/?$2=$3&%1 [R=301]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule  ([^/])/([^/]) http://localhost/index.php?module=$1&action=$2&%1 [R=301]


Par exemple -http://localhost/module1/action1/par1-val1/par2-val2/par3-val3/ est récrit en -http://localhost/index.php?module=t&action=m&par3=val3

Si tu enlève le [R=301] de la deuxième règle, l'URL affichée dans le navigateur reste l'URL originale, mais le contenu est bien celui de l'URL après réécriture.

L'ordre des règles est important!

HyWaN
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 14
Inscription: 4 Juil 2005

Message le Ven Mar 21, 2008 16:38

Edit : j'ai testé, et ça ne marche pas vraiment.

J'ai ajouté "+" pour la seconde condition lors de la capture pour avoir plus d'un caractère.

Ce qui ne marche pas : si je fais /mod/act/a-b/c-d/ il ne prends pas a-b et c-d.

Vap
WRInaute passionné
WRInaute passionné
 
Messages: 1090
Inscription: 17 Juin 2007

Message le Ven Mar 21, 2008 18:20

Oui, c'est bizarre. J'ai du me tromper en recopiant les règles.

Essaie ça (je ne suis pas devant mon PC de test):

Code: Tout sélectionner
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/([^/]+)-([^/]+)/$ http://localhost/$1/?$2=$3&%1 [R=301]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule  ^([^/]+)/([^/]+)/$ http://localhost/index.php?module=$1&action=$2&%1 [R=301]

Vap
WRInaute passionné
WRInaute passionné
 
Messages: 1090
Inscription: 17 Juin 2007

Message le Sam Mar 22, 2008 20:43

Testé en local :

Code: Tout sélectionner
RewriteEngine On

RewriteBase /

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/([^/]+)-([^/]+)/$ http://localhost/$1/?$2=$3&%1 [R=301]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule  ([^/]+)/([^/]+)/ http://localhost/index.php?module=$1&action=$2&%1 [R=301]

HyWaN
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 14
Inscription: 4 Juil 2005

Message le Lun Mar 24, 2008 22:28

Presque ;-).

Quand j'ai /AA/BB/, ça marche.
Quand j'ai /AA/BB/a-b/, a-b fonctionne, mais plus /AA/BB/.
Pareil pour /AA/BB/a-b/c-d/.

Je replace dans le contexte. Je l'utilise exactement à cet endroit : http://localhost/~user/Test/<index.php>
Donc dans le second cas (/AA/BB/a-b/), a-b est bien fonctionnel, mais AA est remplacé par localhost et BB par ~user :?.

Voici ce que j'utilise :
Code: Tout sélectionner
RewriteBase /~user/Test/

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/([^/]+)-([^/]+)/$ http://localhost/~user/Test/$1/?$2=$3&%1 [R=301]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule  ([^/]+)/([^/]+)/ http://localhost/~user/Test/index.php?module=$1&action=$2&%1 [R=301]


Autre question, comment conserver l'URL telle qu'écrite ? C'est à dire, ne pas remplacer par la transformation.

Vap
WRInaute passionné
WRInaute passionné
 
Messages: 1090
Inscription: 17 Juin 2007

Message le Mar Mar 25, 2008 1:37

Tu utilise un .htaccess ou tu met tes règles dans le httpd.conf?

Sinon, pour répondre à ta dernière question, enleve le [R=301] de la deuxième règle. Je pense que je l'avais dit plus haut.

Ce que je ferais: je mettrai le .htaccess que je t'ai donné dans le répertoire /~user/Test/ (avec RewriteBase /)

HyWaN
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 14
Inscription: 4 Juil 2005

Message le Mar Mar 25, 2008 20:27

J'utilise un .htaccess.

Avec le changement du RewriteBase à la racine (/), même comportement.

Ne te tue pas à la tâche, je posais cette question par simple curiosité. Si ce n'est pas facilement faisable, cela ne sert à rien de persister (même si j'aimerais voir ce sujet résolu ;-)).


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Formation recommandée sur ce thème :

Formation URL Rewriting et sites dynamiques : apprenez comment mettre en place la réécriture d'URL, comment optimiser vos URL et profiter de vos pages dynamiques pour booster votre référencement. Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité