• Apache+mod_encoding解决URL中文编码问题


    我们经常在论坛上看到这样的求救贴: 
    为什么我看不了网站上中文文件名的文件?这时一定会有好心的大侠告诉说,到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简体中文版本)于是,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通吃.要知道,总会有些特殊需求在URL中有中文的。虽然我们极力避免这样去做。
     
    废话说了一堆,下面是使用mod_encoding解决这个问题的一个方法:
     
    1.下载mod_encoding和安装patch补丁
    http://webdav.todo.gr.jp/download/mod_encoding-20021209.tar.gz
    # cd /data/soft
    # tar -xvf mod_encoding-20021209.tar.gz
     
    另外这里必须要打一个apache的补丁。否则make也会出apxs rc=65536的错误。
    http://d.nicwind.com/files/mod_encoding_64.tar.gz
    # tar -xvf mod_encoding_64
    # cd mod_encoding_64
    # cp mod_encoding.c-apache2.2-20060520.patch /data/soft/mod_encoding-20021209
    # patch -p0 < mod_encoding.c-apache2.2-20060520.patch
     
    2.安装 iconv-hook
    # cd mod_encoding-20021209/lib
    # ./configure --prefix=/usr
    # make
    # make install
    # ldconfig
     
    3.编译 mod_encoding
    # cd ..
    # ./configure --with-apxs=/data/apache/bin/apxs --with-iconv-hook=/usr/local/include
    查看是否已经生成了mod_encoding.o文件,如果有,则make成功继续下边的操作。
    # make
    # gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -Llib -liconv_hook
     
    4 配置 apache 
    # cd /data/apache/conf/httpd.conf
     
    LoadModule headers_module modules/mod_headers.so
    LoadModule encoding_module modules/mod_encoding.so
     
    Header add MS-Author-Via "DAV"
    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
     
    4.重启 apache,如果没有报错则成功。
    # /data/apache/bin/apachel restart
  • 相关阅读:
    第五周项目4-静态成员应用
    第五周项目3-用多文件组织多个类的程序
    python的wraps函数
    python函数加括号于不加括号的区别
    socket.error: [Errno 10048]
    tensorflow的MNIST教程
    cidr地址段
    mongodb数据库的存储问题
    搭建巡风扫描器
    mongodb的数据库,集合,数据可介绍。
  • 原文地址:https://www.cnblogs.com/oldking/p/6698144.html
Copyright © 2020-2023  润新知