问题:
用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./download/mod_encoding-20021209.tar.gz
- # wget http://webdav.todo./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./~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>
|