2012-08-08 122 views
1

我试着去弄清楚为什么nginx的正试图加载一些静态图像与错误的编码静态文件。例如:Nginx的:UTF8编码字符导致

error.log中

2012年8月8日21时十四分46秒[错误] 17968#0:* 71的open() “/家庭/网络/ MYDOMAIN的.com/WEB-INF /图像/ productimage /图像ø.png “ 失败(2:没有这样的文件或目录),客户端:XXXX,服务器: www.mydomain.com,请求:” GET /图像/ productimage/image-%C3%B8.png HTTP/1.1“,host:”www.mydomain.com“,referrer: ”http://www.mydomain.com/“

在我的nginx.conf文件中,我添加了以下内容;

source_charset utf-8; 
charset utf-8; 

但不幸的是,这并没有解决它。

我的虚拟主机配置文件使用以下服务中的图像文件;

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

我正在使用ubuntu,将LANG环境变量设置为这样;

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

任何线索?谢谢 !

回答

1

URI中的百分比编码实际上是编码的两个步骤,而不是一个。理想的情况下,第一文本编码为UTF-8,UTF-8文本是“百分比编码”在一个URI中使用,产生这样的结果:

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

你能否证实这个URI有编码是否正确?如果从所需字符开始,然后将其编码为UTF-8,然后对其进行百分比编码,结果是%C3%B8?可以手动生成这样的百分比编码脚本:

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

另一种方式把它:你们的确定问题是在nginx的解码,而不是编码?检查包含图像引用的HTML页面的编码。查看HTTP标头和元标签。确保它明确声明为UTF-8。否则,这可能导致浏览器错误地解释该参考。

同样,可以手动测试解码过程中,像这样:

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

我写了一个detailed post about percent-encoding with Perl,如果这是利益作为参考。

+0

嗨,马克,感谢您的回复,我已经通过的Perl通过您的最后一个命令行测试的转义和Perl也似乎输出:/images/productimage/image-ø.png,而不是期望/图片/ productimage/image-ø.png,似乎你的建议是正确的,使用编码/images/productimage/image-%F8.png确实加载图像,所以在perl/nginx的情况下,什么决定了默认的解码字符集? – Marius 2012-08-08 20:02:36

+0

Marius,我已经将它添加到我的答案中:“检查包含图像引用的HTML页面的编码。查看HTTP标头和元标签。确保它明确声明自己为UTF-8。“ – 2012-08-08 20:09:45

+0

这就是解决方案的一部分,但在这种情况下,我想知道,当我直接从浏览器调用url时,并未包含在html页面中,用%C3%B8编码的urlencode,配置用于解码的字符集,nginx或者ubuntu中可配置的编码。 – Marius 2012-08-08 20:42:13