3

我试图弄清楚为什么 nginx 会尝试使用错误的编码加载一些静态图像。例如:

error.log

2012/08/08 21:14:46 [错误] 17968#0: *71 open() "/home/www/mydomain.com/WEB-INF/images/productimage/image-ø.png" 失败 (2 :没有这样的文件或目录),客户端:xxxx,服务器:www.mydomain.com,请求:“GET /images/productimage/image-%C3%B8.png HTTP/1.1”,主机:“www.mydomain.com ", 推荐人: "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

有什么线索吗?谢谢 !

4

1 回答 1

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

如果有兴趣作为参考,我已经写了一篇关于 Perl 百分比编码的详细文章。

于 2012-08-08T19:46:02.427 回答