3 votes

Nginx : Fichiers statiques encodant les caractères utf8 résulte en Ã

J'essaie de comprendre pourquoi nginx essaie de charger des images statiques avec le mauvais encodage. Par exemple :

A partir de la error.log :

2012/08/08 21:14:46 [error] 17968#0 : *71 open() "/home/www/mydomain.com/WEB-INF/images/productimage/image-ø.png" a échoué (2 : No such file or directory), client : x.x.x.x, server : www.mydomain.com, request : "GET /images/productimage/image-%C3%B8.png HTTP/1.1", host : "www.mydomain.com", referrer : "http://www.mydomain.com/"

Dans mon fichier nginx.conf, j'ai ajouté ce qui suit ;

source_charset utf-8;
charset utf-8;

Malheureusement, cela n'a pas résolu le problème.

Mon fichier de configuration vhost utilise ce qui suit pour servir les fichiers images ;

    location /images/
    {
            alias /home/www/mydomain.com/WEB-INF/images/;
            expires 15d;
    }

J'utilise ubuntu, avec les variables d'environnement LANG définies comme suit ;

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

Un indice ? Merci d'avance !

1voto

Mark Stosberg Points 3050

Le codage en pourcentage dans les URI correspond en réalité à deux étapes de codage, et non à une seule. Idéalement, le texte est d'abord codé en UTF-8, puis le texte UTF-8 est "codé en pourcentage" pour être utilisé dans un URI, ce qui donne un résultat comme celui-ci :

/images/productimage/image-%C3%B8.png

Pouvez-vous confirmer que cet URI a été codé correctement ? Si vous commencez par le caractère que vous voulez, que vous l'encodez en UTF-8 et que vous l'encodez en pourcentage, le résultat est-il %C3%B8 ? Vous pouvez générer manuellement un script codé en pourcentage comme ceci :

 $perl -MCGI -e 'print CGI::escape("Hello World")."\n";'
 Hello%20World

Une autre façon de le dire : Êtes-vous sûr que le problème se situe au niveau de la décodage par Nginx, et non le codage ? Vérifiez l'encodage de la page HTML qui contient la référence de l'image. Examinez les en-têtes HTTP et les métabalises. Assurez-vous qu'elle se déclare explicitement comme UTF-8. Dans le cas contraire, le navigateur pourrait mal interpréter la référence.

Vous pouvez également tester manuellement le processus de décodage, comme suit :

 perl -MCGI -e 'print CGI::unescape("/images/productimage/image-%C3%B8.png")."\n";'
 /images/productimage/image-ø.png

J'ai écrit un billet détaillé sur l'encodage en pourcentage avec Perl si cela peut vous intéresser en tant que référence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X