Première rédaction de cet article le 10 novembre 2008
J'ai passé une bonne partie de la journée à porter un site Web Mason vers une nouvelle machine. Comme la première avait Apache 1 et mod_perl 1 et que la seconde machine avait les versions 2, cela n'a pas été tout seul.
J'utilisais pas mal Mason à un époque. C'est un environnement de développement en Perl pour faire des sites Web dynamiques. Il est utilisé notamment pour amazon.com. Il s'appuie sur l'intégration de Perl dans Apache, mod_perl.
On trouve pas mal de récits d'expérience d'une telle migration sur le Web. Curieusement, tout le monde n'a pas eu les mêmes bogues et ce n'est pas la même solution qui marche pour tous. Voici donc les deux points qui ont été les plus bloquants pour moi.
J'avais un fichier index
dans chaque
répertoire et une directive DirectoryIndex index
dans la configuration d'Apache. En Apache 1, cela marchait mais, en
Apache 2, la directive DirectoryIndex
semble
complètement ignorée dans un répertoire géré par Mason. Résultat,
lorsque le client HTTP demandait un URL qui se terminait par un répertoire,
pas un fichier, le
serveur renvoyait un code 404 et notait dans son journal [error] [client
192.134.4.69] Attempt to serve directory:
/var/www/www.generic-nic.net/dyn/whois/.
La solution qui a marché pour moi est de chercher le fichier
index
via une règle de réécriture Apache :
RewriteEngine on RewriteRule ^(.*)/$ $1/index
Cette règle dit que si l'URL se termine par /,
on ajoute index
à la fin. Ce n'est rien, mais j'ai dû essayer pas mal de fausses solutions
avant, souvent très complexes.
Le second problème concernait l'appel d'une méthode dans les fichiers Mason. Pour donner un titre aux pages, le site utilisait une technique Mason très classique :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Generic NIC: <& SELF:title &></title>
où <& SELF:title &>
signifiait
qu'on appelle la méthode title
. Celle-ci est
définie dans chaque page :
<%method title>Technical details on the domain information</%method>
Mais cette technique ne marche plus avec mod_perl 2, la méthode n'est
plus dans l'espace SELF
mais dans
REQUEST
. Il faut donc réécrire le fichier qui
contient l'en-tête HTML ainsi :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Generic NIC: <& REQUEST:title &></title>
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)