Invité Posté 13 Janvier 2010 Posté 13 Janvier 2010 (modifié) 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é 13 Janvier 2010 par Evangun
captain_torche Posté 13 Janvier 2010 Posté 13 Janvier 2010 Mon sujet précédent a été effacé, est-ce que j'ai dit qqch de mal, ou pas posté au bon endroit ? Non, ne t'inquiètes pas, on a juste eu un crash de la base de données. Ton post est un des rares qui ont disparu
ams51 Posté 13 Janvier 2010 Posté 13 Janvier 2010 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]
Invité Posté 13 Janvier 2010 Posté 13 Janvier 2010 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.
Jeanluc Posté 13 Janvier 2010 Posté 13 Janvier 2010 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
Invité Posté 13 Janvier 2010 Posté 13 Janvier 2010 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 ), 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 ?
Invité Posté 13 Janvier 2010 Posté 13 Janvier 2010 (modifié) 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é 13 Janvier 2010 par Evangun
Invité Posté 13 Janvier 2010 Posté 13 Janvier 2010 (modifié) 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é 14 Janvier 2010 par Evangun
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant