我们经常在论坛上看到这样的求救贴: 为什么我看不了网站上中文文件名的文件?这时一定会有好心的大侠告诉说,到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
这个需要在mod_encoding-20021209文件夹下执行

# cd mod_encoding-20021209 
./configure --with-apxs=/opt/apache2.2/bin/apxs --with-iconv-hook=/usr/include

(我的是lampp所以路径是./configure --with-apxs=/opt/lampp/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

(这是我的路径cp mod_encoding.so  /opt/lampp/modules,根据情况定)

4. config apache 2.2 
//配置apache的congfig文件

//lampp 的apache配置文件在/opt/lampp/etc/httpd.conf

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 均可以正常下载中文名字文件。

Apache2.2+mod_encoding解决URL中文编码问题的更多相关文章

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

    我们经常在论坛上看到这样的求救贴:  为什么我看不了网站上中文文件名的文件?这时一定会有好心的大侠告诉说,到IE6的工具,Internet选项, 高级里,把"总是以UTF-8发送URL&qu ...

  2. 解决URL请求中的中文乱码问题

    解决URL提交中文出现乱码有两种办法:1.请求端的中字符有encodeURI进行一次转码,如: var url="/getUser?name="+encodeURI(name);服 ...

  3. 解决URL地址中的中文乱码问题的办法

    解决URL地址中的中文乱码问题的办法 引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生 ...

  4. 解决URL中文乱码问题--对中文进行加密、解密处理

    解决URL中文乱码问题--对中文进行加密.解密处理 情景:在资源调度中,首先用户需要选择工作目标,然后跟据选择的工作目标不同而选择不同的账号和代理ip.处理过程如下:点击选择账号,在js中获取工作目标 ...

  5. iOS - 网址、链接、网页地址、下载链接等正则表达式匹配(解决url包含中文不能编码的问题)

    DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符,也不区分大小写字母.标号中除连字符(-)外不能使用其他的标点符号.级别最低的域名写在最左边,而级别最高的域名写在最右边.由多 ...

  6. 解决Url带中文参数乱码问题

    这里我来介绍下如何配置Tomcat 来解决Url带中文参数乱码问题: 首先打开Tomcat安装目录,以Tomcat7为例,其他版本基本一样: 打开conf文件 打开server.xml 大概在70行左 ...

  7. 转:解决Python中文编码问题

    Python 文本挖掘:解决Python中文编码问题 转于:http://rzcoding.blog.163.com/blog/static/2222810172013101785738166/   ...

  8. Spring Cloud Gateway 动态修改请求参数解决 # URL 编码错误传参问题

    Spring Cloud Gateway 动态修改请求参数解决 # URL 编码错误传参问题 继实现动态修改请求 Body 以及重试带 Body 的请求之后,我们又遇到了一个小问题.最近很多接口,收到 ...

  9. java中文乱码解决之道(八)-----解决URL中文乱码问题

    我们主要通过两种形式提交向服务器发送请求:URL.表单.而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面.通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了.不 ...

随机推荐

  1. USB入门开发的八个问题&USB枚举『转』

    USB 基本知识 USB的重要关键字: 1.端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点.输出端点.配置端点 ...

  2. vue 引入阿里图标

    1.去阿里图标矢量图标库将想要的图标添加入库 2.再去库中将图标添加到项目. 3.再到我的项目中,选择,我这里采用的是将图标代码包下载到本地再引入到vue项目中. 4.在vue项目的assets文件夹 ...

  3. mac 支持rz sz

    安装 lrzsz brew install lrzsz 配置 iTerm2 安装完成后我们需要在 iTerm2 中使用的话,还需要一些配置 进入到 /usr/local/bin 目录下,下载两个脚本文 ...

  4. HDU 5125 magic balls(线段树+DP)

    magic balls Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. poj3216 Prime Path(BFS)

    题目传送门  Prime Path The ministers of the cabinet were quite upset by the message from the Chief of Sec ...

  6. 64.Find the Duplicate Number(发现重复数字)

    Level:   Medium 题目描述: Given an array nums containing n + 1 integers where each integer is between 1 ...

  7. tomcat在cmd中部署到系统服务

    基本步骤: 1.首先把整个tomcat拷贝到安装路径 2.打开cmd,设置JAVA_HOME,设置的值是对应cmd的局部变量 set JAVA_HOME=E:\tmp\2016\bghc\jdk1.7 ...

  8. Vue证明题

    看来我需要对我的vue能力做一个证明了~~ 最近辞职了,又逢病重,找工作的时候发现对vue要求蛮高的,说会不行,还必须要有过vue的项目. 我这种半路出家的哪里来的vue的项目,公司又不是那种一线互联 ...

  9. 关于C++中的非静态类成员函数指针

    昨天发现了一个问题,就是使用对类中的非静态成员函数使用std::bind时,不能像普通函数一样直接传递函数名,而是必须显式地调用&(取地址),于是引申出我们今天的问题:非静态类成员函数指针和普 ...

  10. C语言实现Windows下获取IP和MAC地址。

    C语言实现Windows下获取IP和MAC地址. #include <winsock2.h> #include <stdio.h> #include <stdlib.h& ...