Réécriture en boucle partielle.

  • Auteur de la discussion Auteur de la discussion HyWaN
  • Date de début Date de début
Nouveau WRInaute
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:
/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 :).
 
WRInaute impliqué
HyWaN a dit:
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:
/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.
 
WRInaute impliqué
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:
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.
 
Nouveau WRInaute
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:
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:
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:
<?php

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

print_r($_GET);
echo getcwd() . "\n";
echo __FILE__;
Voici les résultats :
Code:
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 :).
 
WRInaute impliqué
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.
 
WRInaute impliqué
Les règles suivantes ont l'air de faire ce que tu veux (testé en local):

Code:
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!
 
Nouveau WRInaute
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.
 
WRInaute impliqué
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:
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]
 
WRInaute impliqué
Testé en local :

Code:
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]
 
Nouveau WRInaute
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:
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.
 
WRInaute impliqué
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 /)
 
Nouveau WRInaute
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 ;-)).
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut