Techyou labs
真正的爱应该超越生命的长度、心灵的宽度、 灵魂的深度
常用标签

最近有用户说服务器上无法访问带空格的目录和文件,原因是apache默认只支持拉丁语的url,google下
就是在linux下通过apache访问中文(据测试,日文也可以)的url路径的模块.日本人开发的,不要太愤青了哦。
我的环境:centos5,httpd 2.2.9
测试通过.
注意:需要mod_headers的支持(一般默认apache编译已经有了,所以在有的modules里看不到。)
Url:http://webdav.todo.gr.jp/

1.download and patch

cd /zh/src/
wget http://webdav.todo.gr.jp/download/mod_encoding-20021209.tar.gz
#download patch
wget http://webdav.todo.gr.jp/download/experimental/
         mod_encoding.c.apache2.20040616
tar -xzvf mod_encoding-20021209.tar.gz

用新版本mod_encoding.c覆盖

cp mod_encoding.c.apache2.20040616 mod_encoding-20021209/mod_encoding.c
#download patch
wget http://www.aconus.com/~oyaji/faq/
         mod_encoding.c-apache2.2-20060520.patch
cp mod_encoding.c-apache2.2-20060520.patch mod_encoding-20021209/
cd mod_encoding-20021209
patch -p0 < mod_encoding.c-apache2.2-20060520.patch

2.install iconv-hook
安装mod_encoding前首先需要安装iconv_hook。

cd /zh/src/mod_encoding-20021209/lib
./configure
make
make install

完成上面操作后,iconv_hook相关so文件放到/usr/local/lib下面。
要操作系统系统能够搜索到该so文件,需要完成一下几行操作
打开/etc/ld.so.conf文件,添加一行指向iconv_book的所在路径,即”/usr/local/lib”
也可以:

echo  /usr/local/lib >> /etc/ld.so.conf
ldconfig

3.build mod_encoding

cd /zh/src/mod_encoding-20021209/
./configure --with-apxs=/usr/local/apache2/bin/apxs --with-iconv-hook=/usr/include
make

#ls -l mod_encoding.o

查看是否已经生成了mod_encoding.o文件,如果是,则make成功继续下边的操作。

# gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -L/usr/local/lib -Llib -liconv_hook

或者

gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -Llib -liconv_hook

生成mod_encoding.so文件,将该文件拷贝到你的模块存放目录,一般为${APACHE_HOME}/modules/

cp mod_encoding.so /usr/local/apache2/modules

4. config apache 2.2

# convert url to utf8
LoadModule encoding_module modules/mod_encoding.so
<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>

重启apache测试效果。

已知问题:

这个问题是mod_encoding已经先一步处理了url ,而PHP又解了一次
例如
x.php?s=%252B%2F%2B%2F
那么$_GET[’s’]得到的是
+/ /
urlencode("+") = %2B
urlencode("%2B") = %252B

所以,这个url被decode了两次
第一次是
urldecode( "%252B%2F%2B%2F") = %2B/+/
urldecode( "%2B/+/") = +/ /

解决办法:
修改httpd.conf 将

EncodingEngine on
...
...

这一段配置移到需要的vitualHost里去,不用设置在全局配置中,这个不能和php脚本并存.

暂无评论

添加新评论