RewriteRule et la recherche personnalisée de google

Frameworks

| par Teddy Payet

Après un long thread sur la liste des utilisateurs de SPIP sur la galaxie SPIP et ses nombreux sites référents, il en est sorti qu’il existait une recherche google personnalisée permettant en une fois de lancer une recherche sur tous les sites officiels de Spip.

Contexte

b_b et Benny_b s’occupent d’administrer le site d’Edgard et ont fait un excellent travail.

L’un des projets est de pouvoir par une simple URL lancer une recherche sur cette fameuse recherche personnalisée sous la forme http://edgard.spip.org/questions/?truc. On est redirigé de suite vers la page google avec notre terme "truc" en recherche.
Bien.

Par le plus pure des hasards, je me suis connecté sur IRC, j’ai vu b_b se prendre la tête sur la question. Il a cherché la règle RewriteRule pour que cela se fasse en toute transparence. Mais cela aboutissait à une erreur 400 sur Google.
En fait, après un échange avec lui, j’ai vu qu’il y avait une erreur dans l"identifiant "cx". Il manquait le "%3" dans l’url.
En fait, le RewriteRule fait un échappement de "ce" caractère.

Le code

Voici sa règle de départ :
RewriteRule ^questions/?(.*) http://www.google.com/cse?cx=006670395242166965407%3Arjhbrr1gwro&ie=UTF-8&q=$1 [QSA,R,L]

Petites explications :

  • ^questions/?(.*) : si dans l’url, on ajoute questions/?, le serveur Apache prend en compte ce qu’il y a après pour le réinjecter dans l’url qui suit par l’intermédiaire du $1.
  • QSA : ou le "qsappend". Passe en paramètre de l’url les variables transmises. Donc séparées par un "&". (cf. http://httpd.apache.org/docs/2.1/fr...)
  • R : ou le "redirect". Indique au serveur Apache que c’est une redirection. Souvent couplé à "L" (cf. http://httpd.apache.org/docs/2.1/fr...)
  • L : ou le "last". mod_rewrite arrête le traitement du jeu de règles. Cela signifie dans la plupart des situations que si la règle s’applique, aucune autre règle ne sera traitée. (cf. http://httpd.apache.org/docs/2.1/fr...)

Problèmes

  • Avec cette règle, le terme recherché est passé en paramètre, ce qui nous fait quelque chose comme q=&truc. Cela ne fonctionne pas.
  • le "%3" de l’identifant "cx" est échappé. Donc, une mauvaise requête au serveur de Google.

Recherches et solution
b_b devant se déconnecter, j’ai continué la discussion avec Benny_b et lancer des tests.
Je vais vous épargner tous les tests que j’ai fait. Toutefois, ayant la main sur mon serveur, j’ai réalisé tout ça sur mon espace d’hébergement.

Voici la solution apportée.

La solution

RewriteRule ^questions/(.*)$ http://www.google.com/cse?cx=006670395242166965407\%3Arjhbrr1gwro&ie=UTF-8&q=$1 [NE,R,L]
Vous pouvez voir que nous sommes maintenant sous la forme questions/truc et non plus questions/?truc

Explications

  • On enlève le " ?" car, même s’il est exclu par un antislash "\", le RewriteRule ne l’aimait pas.
  • On échappe le "%" avec un antislash "\" pour ne pas être échappé par le mod_rewrite.
  • NE : ou le "noescape". Par défaut, les caractères spéciaux, comme & et ?, sont convertis en leur équivalent hexadécimal. Le drapeau [NE] permet d’éviter cette conversion. (cf. http://httpd.apache.org/docs/2.1/fr...)

Vous pouvez le tester sur mon site :
http://www.teddypayet.com/questions/galaxie
http://www.teddypayet.com/questions/Boussole

Si vous désirez faire une recherche sur un groupe de mots ("Spip est géniale"), on doit remplacer les espaces par des "+" :
http://www.teddypayet.com/questions/Spip+est+géniale
http://www.teddypayet.com/questions/"Spip+est+géniale" (Avec des quotes pour rechercher l’expression exacte)