我们经常在论坛上看到这样的求救贴: 为什么我看不了网站上中文文件名的文件?这时一定会有好心的大侠告诉说,到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. VB.NET导出Excel 轻松实现Excel的服务器与客户端交换 服务器不安装Office

    说来VB.Net这个也是之前的一个项目中用到的.今天拿来总结下用途,项目需求,不让在服务器安装Office办公软件.这个也是煞费了一顿. 主要的思路就是 在导出的时候,利用DataTable做中间变量 ...

  2. cnn模型

    https://blog.csdn.net/qq_26591517/article/details/79805884

  3. iterm2简易登录服务器

    文章目录 添加文件 添加配置 直接登录 方法一 方法二 添加文件 在mac任意目录添加 10.0.1.1.txt ,这里的名字可以随意起,也可以不是txt #!/usr/bin/expect set ...

  4. Asp.Net Core 第01局:项目创建和部署 转载https://www.jianshu.com/p/9c9750e23b3e

    总目录 一.前言 本文通过从项目创建到部署,简单介绍Asp.Net Core. 二.环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 三.开局 第一手:创建项目   ...

  5. linux下的命令是如何运行的

    linux下的命令分为内建命令.可执行文件.脚本文件 shell终端里键入一个命令,如ls.cd.bash,shell会先查询一个环境变量PATH,它存了各种可执行文件的路径,输入$PATH可以打印变 ...

  6. 简单DP入门(二) 最长上升子序列及其优化

    最长上升子序列解决问题: 有N个数,求出它最长的上升子序列并输出长度. 在题里不会讲的这么直白,这个算法往往会与其他的算法混在一起使用. 在这篇文章中不会出现其他的例题,为了让大家更好的理解,我只会对 ...

  7. python学习那点事---列表生成式实现大小写字母相互转换

    题目: 已知列表list=["pYTHON","iS",eASY],要求使用列表生成式实现,生成一个新的列表,要求将大写字母转换为小写字母,小写字母转换为大写字 ...

  8. Vue中src属性绑定的问题

    地址:https://blog.csdn.net/qq_25479327/article/details/80082520 地址:https://blog.csdn.net/sinat_3655513 ...

  9. undefined,null,var 0 = {},var s = '',的区别

    undefined:不清楚变量的类型:var m; null:知道该变量是对象的引用,但是地址为空 var o = {};这是一个对象,有指向地址,但是值为空 var 0 = '';这是一个空的字符串

  10. C++中的类与封装

    1,类的组合: 1,类不是孤立存在的,类之间都会有一些关系,组合就是类的基本关系之一: 2,电脑一般而言是由 CPU.内存.主板.键盘和硬盘等部件组合而成: 3,学习电脑组装需要多少时间?学习电脑组装 ...