Webmaster Hub: Doubles règles d'urlrewriting qui ne s'enchaînent pas - Webmaster Hub

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

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

#1 L'utilisateur est hors-ligne   Evangun 

  • Groupe : Actif
  • Messages : 28
  • Inscrit(e) : 27-août 07
  • Genre:Homme

Posté 13 janvier 2010 - 12:03

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 http://www.dailymoti...onnie+%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]

Ce message a été modifié par Evangun - 13 janvier 2010 - 12:17.

0

#2 L'utilisateur est hors-ligne   captain_torche 

  • Danacol / Orangina rouge
  • Groupe : Admin
  • Messages : 6 658
  • Inscrit(e) : 08-février 06
  • Genre:Homme
  • Localisation:Savigny / Orge

Posté 13 janvier 2010 - 12:06

Voir le messageEvangun, le 13 janvier 2010 - 12:03, dit :

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 ;)



Vous avez rêvé cette nuit ? Partagez vos rêves sur l'Onironaute !
Bijoux fantaisie
Recherche nounou
0

#3 L'utilisateur est hors-ligne   ams51 

  • Artisan du Web
  • Groupe : Membre+
  • Messages : 1 264
  • Inscrit(e) : 22-mars 04
  • Genre:Homme
  • Localisation:Izeaux
  • Société:Travailleur Indépendant

Posté 13 janvier 2010 - 12:17

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]
Arnaud.
Forex - Conversion monnaie - Taux de change
Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre. Galilée
0

#4 L'utilisateur est hors-ligne   Evangun 

  • Groupe : Actif
  • Messages : 28
  • Inscrit(e) : 27-août 07
  • Genre:Homme

Posté 13 janvier 2010 - 12:28

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

#5 L'utilisateur est hors-ligne   Jeanluc 

  • Groupe : Fondateur
  • Messages : 1 995
  • Inscrit(e) : 04-octobre 04
  • Genre:Homme
  • Localisation:Bruxelles

Posté 13 janvier 2010 - 12:39

Voir le messageEvangun, le 13 janvier 2010 - 12:03, dit :

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
Liste de + de 150 annuaires FreeGlobes et autres listes d'annuaires pour le référencement.
Testeur de redirection (301, 302, meta refresh,...)
Le Grand Annuaire : comme DMOZ, mais avec indexation super-rapide
0

#6 L'utilisateur est hors-ligne   Evangun 

  • Groupe : Actif
  • Messages : 28
  • Inscrit(e) : 27-août 07
  • Genre:Homme

Posté 13 janvier 2010 - 12:57

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

#7 L'utilisateur est hors-ligne   Evangun 

  • Groupe : Actif
  • Messages : 28
  • Inscrit(e) : 27-août 07
  • Genre:Homme

Posté 13 janvier 2010 - 18:52

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 !

Ce message a été modifié par Evangun - 13 janvier 2010 - 18:53.

0

#8 L'utilisateur est hors-ligne   Evangun 

  • Groupe : Actif
  • Messages : 28
  • Inscrit(e) : 27-août 07
  • Genre:Homme

Posté 14 janvier 2010 - 00:37

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 :)

Ce message a été modifié par Evangun - 14 janvier 2010 - 01:33.

0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)