【教程】调整Linux 环境让apache对中文文件名的支持
近日,有同事遇到一个奇怪问题:在开发环境,apache能正常支持中文文件下载,但切换到测试环境就404错误,找不文件,两个环境都是linux系统。我起先怀疑的是linux下需要对apache进行配置,以支持中文名。但研究了一下两个环境的配置,开发环境除apache版本高了点外,并没有其他特殊配置。所以怀疑版本问题,又把开发环境的apache及配置同步到了测试环境,重启依然无效。折腾半天,基本上可以判定这个问题应该与apache配置和版本无关了。
网上google了一把,有很多关于mod_encoding.so模块实现中文支持和IE浏览器中取消"发送UTF-8 URL"的设置,考虑到开发环境并没有加入额外的module,也没设置IE选项,所以也没在意这些方案,况且这两个方案也不便于生产环境布署或实际应用。
后来,又请教了SA和其他同学,还是没有结果。只能继续摸索,查找原因。通过两个环境的反复比较,终于发现了问题所在:
通过 locale 查看了系统的字符集,开发机上是en_US.UTF-8,而测试机上是zh_CN.GBK;开发机上显示的中文文件名是乱码,测试机上显示正常,但反而显示为乱码的开发机上能被下载,而测试机上显示正常的文件不能被下载。后来,将测试环境的字符集也设为:en_US.UTF-8,并从svn重新迁出了中文名的文件,发现确实可以被读取到。
分析一下原因,ie客户是发送"UTF-8 URL"到apache,apache以utf-8编码的文件名查找相关目录下的文件,如果此时中文文件是以GBK或其他字符集保存时,就无法找到匹配的文件。所以网上说的IE浏览器中取消"发送UTF-8 URL"的设置就有效的说法就可以解释了。
结论:linux环境下apache中文文件下载支持与该文件的字符集有关,只要创建或从svn迁出中文文件文件时,linux系统为UTF-8的字符集,或中文文件名以UTF-8编码的文件,即能被apache正确读取。网上有资料说,apache 2.x 以上版本即支持中文文件名,虽然未经验证,但至少可以肯定apache 2.0.55、2.0.63是没有问题的。
Linux系统下设置系统字符集
查看系统已安装的字符集
命令:
locale -a 查看本地字符集
locale -m 查看所有支持的字符集
执行命令:
[sws_code language="html"] [/sws_code]
显示结果为
[sws_code language="html"] [/sws_code]
执行命令
[sws_code language="html"] [/sws_code]
显示结果为
[sws_code language="html"] [/sws_code]
设置系统默认字符集
1〉查看系统配置参数
[sws_code language="html"] [/sws_code]
修改系统配置参数
2>临时修改
[sws_code language="html"] [/sws_code]
例如:
[sws_code language="html"] [/sws_code]
注意:export修改参数仅限于当前登陆状态时有效,重启后失效,需要写入/etx/profile文件。
3〉永久修改
修改profile文件:
所有用户(不安全)
修 改/etc/profile(对所有用户都是有效的)
[sws_code language="html"] [/sws_code]
在里面加入:
[sws_code language="html"] [/sws_code]