日期:2014-05-16  浏览次数:20967 次

subversion+apache的中文路径问题解决过程

问题:

? 用subversion+apache搭建好svn服务器后,发现svn库不支持中文路径。

?

解决过程:

  • 定位问题

? ? ? ? 创建中文路径时,subversion报错内容是:http://**********/03%20%E6%B5%8B%E8%AF%95/ path not found,大概的意思是,subversion在服务器中找不到需要创建的目录的路径。

? ? ? ? 由于路径是存在的,因此通过分析发现,应该是编码的问题,导致路径找不到。从报错信息上看“03%20%E6%B5%8B%E8%AF%95”是属于中文的UTF-8编码。

? ? ? ? 如果浏览器发送的是UTF-8编码导致路径找不到,那服务器用的编码肯定就不是UTF-8了,确认一下:

? ? ? ? 1、把服务器的环境变量修改为GBK: export LANG=zh_CN.GBK

? ? ? ? 2、touch 中文测试.txt

? ? ? ? 3、ls 输出能看到“中文测试.txt”,证明服务器保持的目录路径是GBK编码的

?

? ? ? ? ?那问题就找到了:客户端发送的URL编码是UTF-8,但是服务器保存的是GBK,因此,就没办法对应上了。

?

?

  • 解决问题

? ? ? ?定位了问题就好办了(只是我以为,结果折腾了我一天),要不要求客户端发送GBK编码的路径,要不就把UTF-8编码的URL转码为GBK。第一个方法不现实,因为客户是上帝嘛,那就

? ? ? ?向第二个方法努力吧!

?

? ? ? ?问了谷哥,apache本身就是用UTF-8编码去decode路径的,没有配置可以修改,但是可以使用一个模块去做URL的转码,这个模块就是 mod_encoding,好,那就去安装吧!

?

? ? ? ?安装大概的过程是这样的:

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
<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>

?

? ? ? ? ?上面的安装过程是网上抄袭的,我按照这个去安装碰到了几个问题:

1、# cd mod_encoding-20021209/lib

? ? ? ? ?安装这个iconv_hook的时候出错,看了他的安装过程,是需要联网的,我使用的服务器不能联网,杯具!

? ? ? ? ?那只好上网找了一个iconv_hook的rpm包,直接rpm -ivh安装了

?

2、最后模块的配置如下

LoadFile /usr/local/apache2/modules/libiconv_hook.so.1
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 UTF-8
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>

?