我想弄清楚为什么 nginx 会尝试使用错误的编码加载一些静态图像。例如:
来自error.log:
2012/08/08 21:14:46 [error] 17968#0: *71 open() "/home/www/mydomain.com/WEB-INF/images/productimage/image-ø.png" failed (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/"
在我的 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
有什么线索吗?谢谢!
最佳答案
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 header 和元标记。确保它明确声明自己为 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 ,如果有兴趣作为引用。
关于file - Nginx:静态文件编码 utf8 字符导致 Ã,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11871874/