问题:
? 用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>
?