Drupal et filtres: méfiez vous des caches (et surtout des URL absolues) !

Share and options

Au cours de mes mésaventures avec Drupal, le module Image et les différents comportements des caches, j'ai fini par trouver la vraie cause de mes problèmes.

Pour récapituler mon précédent billet, mon problème était que certaines images affichées dans mes contenus Drupal avaient une URL en dur, ce qui provoquait des erreurs quand on changeait de site (donc de nom de domaine).

Pour comprendre le problème, il faut connaitre le contexte, j'ai donc:

* un serveur avec sa base de donnée, son apache, et son Drupal, sur un réseau interne non accessible depuis Internet
* des développeurs, qui touchent à ce serveur directement depuis le réseau interne (avec un nom de domaine interne qui n'existe pas depuis l'exterieur)
* un apache proxy, qui permet d'y accéder depuis l'extérieur
* un nom de domaine différent pour y accéder de l'extérieur qui pointe sur le apache proxy

Dans cette configuration, une URL en dur dans un contenu Drupal qui pointe sur le nom de domaine interne, ne fonctionnera pas si on accède depuis l'exterieur (puisque le nom de domaine, donc l'URL change).

Voilà, vous connaissez la source du bug. Mais maintenant, vous vous demandez "Mais pourquoi diantre les images ont-elles une URL en dur ?!". La réponse est:
1) elle n'ont pas toute une URL en dur
2) parce que le mec qui à codé le module qui fait ça à pas trop réfléchit à ce moment là !

Une fois de plus, le problème n'étant pas reproductible à tous les coups (une grosse partie des images n'ont pas une URL en dur, mais bel et bien une URL relative à la racine du site), j'ai décidé d'introspecter le code, et voici ce que j'ai trouvé:

* les modules Image et Img_assist ne mettent pas d'URL en dur, ils génèrent tout deux une URL relative à la racine du site quand ils affichent une image;
* l'erreur se produit à chaque fois que nous manipulons un champ de type Imagetype de contenu CCK.
* le champ Image est ajouté au CCK par le module Imagefield.

C'est donc le module Imagefield qui construit des URL en dur (au lieu de construire des URL relatives à la racine du site).
Là je vous passe tous les détails, mais après avoir fouillé le code quelques minutes, maintenant que je savais où était le problème, j'ai en fait trouvé que le développeur qui à créé ce module à utilise la méthode file_create_url().

<?php
function theme_imagefield_image($file, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
  ..
     
$url = file_create_url($path);
  ..
  }
}
?>

Cette méthode créé une URL absolue comprenant le nom de domaine et le chemin complet vers le fichier, au lieu d'utiliser la méthode file_create_path(), qui créé une URL relative au nom de domaine..

Après deux séances de plus de deux heures, pour trouver la source de ce bug, croyez moi, j'ai vraiment envie de taper l'auteur de ce module.
Ceci dit, je me contenterais de lui soumettre un patch sur son bugtracker, si une version plus récente ne corrige pas déjà le problème.