设为首页 收藏本站
查看: 710|回复: 0

[经验分享] Apache2.2+mod_encoding解决URL中文编码问题-2008.1.8

[复制链接]

尚未签到

发表于 2018-11-22 08:38:00 | 显示全部楼层 |阅读模式
  我们经常在论坛上看到这样的求救贴: 为什么我看不了网站上中文文件名的文件?这时一定会有好心的大侠告诉说,到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中有中文的。虽然我们极力避免这样去做。
  坦克工厂(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
  
  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
  
  坦克工厂(hi.baidu.com/uroot)
  测试环境:IE(总是以UTF-8发送URL) ,Flashget (GBK),FireFox 2.0.x 均可以正常下载中文名字文件。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-637995-1-1.html 上篇帖子: Apache2 服务器异常问题Your browser sent a request that this server could not understan 下篇帖子: 使用Apache worker MPM 来提高passenger 性能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表