Aller au contenu

Doubles règles d'urlrewriting qui ne s'enchaînent pas


Evangun

Sujets conseillés

Mon sujet précédent a été effacé, est-ce que j'ai dit qqch de mal, ou pas posté au bon endroit ?

en tout cas, merci à Ams51 et Jean-Luc pour vos réponses rapides.

Je réexplique le problème rapidement : j'ai un formulaire qui renvoie vers

monsite.com/search/?query=blabla

Donc je fais une première règle d'urlrewriting qui renvoie vers l'URL que verra l'internaute et les moteurs de recherche :

monsite.com/search/blabla

puis une deuxième règle qui renvoie vers la véritable page php pour le traitement des données :

monsite.com/search.php?query=blabla

Jusqu'ici ça marche, mon souci c'est que les deux règles ne s'enchaînent pas d'affilée: les deux règles semblent s'exécuter au cours de 2 appels distincts à Apache, et je trouve ça crade.

Ams51, cela ne fonctionne pas, les règles ignorent les query strings. D'ailleurs en l'état, la règle marche bien, ce qui m'embête c'est qu'elle ne s'enchaîne pas avec l'autre.

Jean-Luc, effectivement je ne suis pas sûr d'avoir un "problème", si ça se trouve c'est le fonctionnement normal... mais peut-être pas. Là, en l'état actuel des choses, il applique 1 règle au premier passage et une deuxième au deuxième passage. Pourquoi pas les deux en même temps ? Ceci dit, ça me pose une autre question : une redirection 301 implique-t-elle forcément un deuxième hit -> est-ce que le serveur ne peut pas envoyer les données tout en précisant juste que l'adresse a changé ?

Là où je me dis que qqch ne va pas dans ces règles, c'est que les variables de mon URL sont échappées 2 fois, sans doute à cause de ces deux passages par le htaccess.

Exemple : je cherche bonnie & clyde et j'arrive sur la page /search/bonnie+%2526+clyde. Mettre un flag [NE]dans l'une ou l'autre des règles ne fonctionne pas.

Maintenant, regardez sur Dailymotion qui fait exactement la même chose que ce que je veux faire : on cherche bonnie & clyde et l'on arrive sur [color=#FF0000]http://www.dailymotion.com/relevance/search/bonnie+%26+clyde. Les variables n'ont été échappées qu'une fois !

Qu'ont-ils fait pour avoir ce résultat ?

Merci beaucoup encore une fois!

PS: pour mémoire, les règles qui ne s'enchaînent pas en une seule fois sont :

RewriteCond %{QUERY_STRING} ^query=(.*)$

RewriteRule ^search/$ /search/%1? [R=301]

RewriteRule ^search/(.*)$ /search.php?query=$1 [L]

Modifié par Evangun
Lien vers le commentaire
Partager sur d’autres sites

Je remets ma réponse un peu modifiée. Tu as essayé en enlevant la ligne RewriteCond ?

RewriteCond %{QUERY_STRING} ^query=(.*)$

RewriteRule ^search/search.php?query=(.*)$ /search/%1? [R=301]

RewriteRule ^search/(.*)$ /search.php?query=$1 [L]

Lien vers le commentaire
Partager sur d’autres sites

Hello Ams51 et merci, je viens d'essayer ta proposition mais cela ne fonctionne pas. Pour traiter une variable get en urlrewriting, on est obligé de passer par une condition car une rewriterule est incapable de l'attraper dans son pattern.

Lien vers le commentaire
Partager sur d’autres sites

Ceci dit, ça me pose une autre question : une redirection 301 implique-t-elle forcément un deuxième hit -> est-ce que le serveur ne peut pas envoyer les données tout en précisant juste que l'adresse a changé ?
Oui, une redirection implique un deuxième hit. Lors du premier hit, le serveur répond "301: allez voir à l'adresse ***". Ensuite, si le client le veut bien, il va à l'adresse en question où le serveur répondra "200 ok" si tout se passe bien.

D'ailleurs, la redirection peut se faire vers un autre domaine. la nouvelle adresse n'est pas nécessairement sur le même serveur que la première adresse.

Jean-Luc

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ces éclaircissements Jean-Luc.

As-tu alors une idée sur comment obtenir au final

/search/bonnie+%26+clyde

plutôt que

/search/bonnie+%2526+clyde

?

Si je n'y arrive pas (mais Dailymotion y arrive :P ), je ne sais pas s'il ne vaut mieux pas laisser sous la forme

/search/?query=bonnie+%26+clyde

en sachant qu'il y a d'autres paramètres qui ont été rewrités sinon ça ne servirait à rien bien sûr... qu'en pensez-vous, c'est aussi efficace pour le référencement ?

Lien vers le commentaire
Partager sur d’autres sites

J'ai un peu avancé :

en mettant [NE] à la fin de la première règle, les caractères ne sont plus doublement échappés mais du coup ça pose problème au parseur pendant la deuxième règle lorsqu'il y a une esperluette "&".

Du coup, entre les deux, j'essaie de remplacer les & par %26 :

RewriteCond %{QUERY_STRING} ^query=(.*)$

RewriteRule ^search/$ /search/%1? [R=301,NE]

RewriteRule ^search/(.*)&(.*)$ /search.php?query=$1\%26$2

RewriteRule ^search/(.*)$ /search.php?query=$1 [L]

Ma nouvelle règle me donne le résultat voulu mais uniquement s'il n'y a pas plus d'un seul &. Connaissez-vous une règle qui me permettrait de remplacer tous les & ?

Merci !

Modifié par Evangun
Lien vers le commentaire
Partager sur d’autres sites

Bon, je ne m'en sortais pas sans enchaîner les redirections. Faire passer les &, # etc en urlrewriting est vraiment galère, si quelqu'un connait la solution ce ne serait pas de refus.

J'ai contourné le problème en encodant ces caractères avant même la soumission du formulaire (qui finalement n'existe plus, j'en fais une redirection javascript) avec du javascript. Du coup à la fin il n'y qu'eux qui sont doublement encodés dans l'url finale, tant pis pour eux !

Ca ressemble à ça :

function menusearch_submit(){

ms = document.getElementById("menusearch");

document.location.href = "/search/all/relevance/1/"+search_encode(ms.value);

return false;

}

function search_encode(sc){

//première séquence d'encodage

sc = sc.replace(/&/g, "%26");

sc = sc.replace(/#/g, "%23");

sc = sc.replace(/\+/g, "%2B");

sc = sc.replace(/\//g, "%2F");

sc = sc.replace(/\\/g, "%5C");

//deuxième séquence d'encodage (s'occupe d'autres caractères comme "?")

return(encodeURIComponent(sc));

}

et dans l'htaccess je n'ai gardé que ça finalement:

RewriteRule ^search/(all|quiz|test|poll|tag)/(relevance|date|rating|popular)/([0-9]+)/(.*)$ /search.php?type=$1&sort=$2&page=$3&sw=$4 [L]

Voilà, merci à ceux qui ont tenté de m'aider :)

Modifié par Evangun
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...