百度空间 | 百度首页 
               
 
查看文章
 
[Linux]Apache-2.2.8+mod_encoding解决URL中文编码问题-2008.1.8
2008-01-08 15:49
[Linux]Apache-2.2.8+mod_encoding解决URL中文编码问题-2008.1.8
关键词:Apache 2.2, mod_encoding, 中文URL

原创:Tank http://hi.baidu.com/uroot 转帖请注明本出处 2008/1/8

更新:Windows 平台上Apache中文URL编码问题mod_encoding解决方案见:[Server]Windows平台上的mod_encoding.dll For Apache 2.2 的编译 2008.1.31

   我们经常在论坛上看到这样的求救贴: 为什么我看不了网站上中文文件名的文件?这时一定会有好心的大侠告诉说,到IE6的工具,Internet选项, 高级里,把"总是以UTF-8发送URL"去掉.... 于是世界清净了。
      为什么会这样?
      
      我们来看这样一个例子:
      如果是在浏览器里输入这样一个路径 : http://hi.baidu.com/uroot/中文.mp3.对对于包含中文URL来说,
那么浏览器会把"中文" 以类似%HH的方式编码. 那么,http 客户端到底是以GBK编码还是UTF-8编码呢?
在IE里,有这样一个选项,“总以UTF-8发送URL”.而且是缺省的设置。但不是所有的http 客户端都是这样。比如Firefox就是直接以GBK编码(在这里,我们都假定操作系统为Windows XP简体中文版本)
于是,Apache服务器端在获得这样的url时,就可能出现传过来的编码不一样的请求,但是他们请求的目的其实是一个文件。
      下面看Apache如何处理这2个请求:
      对于Apache 来说,它很郁闷的是URL中不会包含任何编码信息,那么它能做的事情最简单的就是接收到文件名后,就原样对文件系统(操作系统)直接发起请求读这个名字的文件。
       对于文件系统来说,肯定是一种编码,例如 UTF-8.那么就意味着apache以GBK编码文件名的请求反馈结果是没找到~~~~ 于是Apache 给http 客户端 送了一个对不起, 404...

  
       所以从用户端看就有很奇怪的事情发生了:用IE(选中UTF-8发送URL)访问(下载)这个mp3文件URL,一切正常。用下载工具比如flashget 或者firefox 访问(下载)这个文件,得到404文件不存在的错误!

通过上面的解释, 对于IE访问www网站中文文件名文件访问出404文件没找到错误的情况,IE把"总是以UTF-8发送URL"选项uncheck的就可以成功的www服务器,我们可以推测出WWW服务器端文件系统采用了GBK编码。

       那么我们有没有办法解决这个问题呢,让Apache 管它是UTF-8还是GBK,GB2312(按照编码规则,GB2312是GBK的子集)通吃.要知道,总会有些特殊需求在URL中有中文的。虽然我们极力避免这样去做。
    坦克工厂(hi.baidu.com/uroot)
    下面是使用mod_encoding解决这个问题的一个方法:
     需求:一台下载服务器,需要下载文件是中文文件名, .这样比较方便用户直观的看到名字下载。
               要求无论是IE还是其他下载工具,都能缺省配置正常下载中文文件,不需要另外设置。
               (也就是说,不管URL编码是UTF-8还是GBK,都能自动适应)
     服务器配制:CentOS 5. GBK 。Apache 2.2.x.

1.download & patch:
# wget http://webdav.todo.gr.jp/download/mod_encoding-20021209.tar.gz
# wget http://webdav.todo.gr.jp/download/experimental/mod_encoding.c.apache2.20040616
新版本mod_encoding.c 覆盖
# cp mod_encoding.c.apache2.20040616 mod_encoding-20021209/mod_encoding.c

这里必须要打一个apache 2.2的补丁。否则make也会出apxs rc=65536 之类的错误。
# wget http://www.aconus.com/~oyaji/faq/mod_encoding.c-apache2.2-20060520.patch
# cd mod_encoding-20021209
# patch -p0 < mod_encoding.c-apache2.2-20060520.patch


2.install iconv-hook
# cd mod_encoding-20021209/lib
# ./configure --prefix=/usr
# make
# make install
# ldconfig

3 build mod_encoding

./configure --with-apxs=/opt/apache2.2/bin/apxs --with-iconv-hook=/usr/include
make
gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -Llib -liconv_hook

cp mod_encoding.so /opt/apache2.2/modules

4. config apache 2.2

LoadModule headers_module modules/mod_headers.so
LoadModule encoding_module modules/mod_encoding.so
<IfModule mod_headers.c>
Header add MS-Author-Via "DAV"
</IfModule>
<IfModule mod_encoding.c>
EncodingEngine on
NormalizeUsername on
SetServerEncoding GBK
DefaultClientEncoding UTF-8 GBK GB2312
AddClientEncoding "(Microsoft .* DAV $)" UTF-8 GBK GB2312
AddClientEncoding "Microsoft .* DAV" UTF-8 GBK GB2312
AddClientEncoding "Microsoft-WebDAV*" UTF-8 GBK GB2312
</IfModule>
坦克工厂(hi.baidu.com/uroot)

测试环境:IE(总是以UTF-8发送URL) ,Flashget (GBK),FireFox 2.0.x 均可以正常下载中文名字文件。


相关文章:
[Server]Windows平台上的mod_encoding.dll For Apache 2.2 的编译 2008.1.31

Tank的其他linux文章:
http://hi.baidu.com/uroot/blog/category/Linux
Linux:Apache-2.2.4 + mod_auth_mysql-3.0.0 +patch的配置 2007-3-12

参考文章,感谢作者:
配置部分:
http://www.cublog.cn/u/32831/showart.php?id=357255
2.2 patch部分参考:
http://www.aconus.com/~oyaji/faq/apache_encoding.htm

类别:linux/win/server | 添加到搜藏 | 浏览() | 评论 (3)
 
网友评论:
1
2008-01-30 20:35 | 回复
这个文章相当的不错,我现在就有这个烦恼,我用的Apache2.2.6+tomcat5.5.25的配置,就存在上面的问题!我的系统是Server 2003,请问如何解决呢,谢谢帮忙:Email:raofei@vip.qq.com
 
2
2008-02-18 14:43 | 回复
非常好的文章 受用了 谢谢
 
3
2008-03-28 19:55 | 回复
8错,我在网上看到过一个搞big5的文章,大概是台湾同胞写的,照着样子做过配置,但是其中有一步一直过不去,楼主强人全搞定了。 有一点小补充,我用的也是centos5, apache用的系统自带的,在安装系统时就安装好的,所以apxs的位置有点不同 在做 ./configure --with-apxs=/opt/apache2.2/bin/apxs --with-iconv-hook=/usr/include 这一步时做了一些修改, 可以用运行 whereis apxs 查处apxs的路径 apxs: /usr/sbin/apxs /usr/share/man/man8/apxs.8.gz 然后 ./configure --with-apxs/usr/sbin/apxs --with-iconv-hook=/usr/include 最后果然吧问题解决了。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu