http://blog.51766.com/comments/zsc/Weblog/1141808884223

星期三 2006年03月08日
linux下apache支持中文名的解决方法!【原创】

公司网站原来使用Windows server 2003+apache+weblogic应用服务器,后全面移植到linux平台下,使用CENTOS4.2 Linux+Apache2.0.54+resin2.1.16或tomcat平台,由于系统的移植,也就产生了一些问题。由于在windos平台下URL地址支持中文文件名,所以我们可以无需对URL编码查看带有中文文件名的网址,而linux平台下的Apache认为URL地址是以UTF-8编码传输的,所以采用以前的访问方式一些含有汉字的路径提示找不到文件(404错误)。尽管我们可以对中文文件名可以进行编码后访问,但是这样的话我们不仅需要修改大量的程序,而且也造成了地址的过长而不容易记忆。所以如何解决Linux下Apache支持中文文件名摆在我们面前,后ytang找到Apache下支持中文文件名的模块mod_encoding,该模块是一日本人开发的。苦于没有资料,偶不知道如何编译为此苦恼几天!后ytang看着日文文档终于搞定了。可是他并为写出相关的编译步骤,今天偶又遇到一个类似的问题,一朋友注册了偶的博客,她用的是中文名ID,而她的中文名只能经过编码后方能访问。于是偶想给Apache加上mod_encoding.so模块,偶的平台是CENTOS4.2+APACHE2.0.54+TOMCAT+MYSQL4.1.13。偶问ytang他如何编译的他说不记的了,开始我以为只要把他的mod_encoding.so文件放到偶的${apache_home}/modules/下,然后在httpd.conf配置文件加入相关的配置就可以了。谁知道提示偶缺少一些so文件,按照提示的目录,我跑到另一台服务器该目录下,将所有相关so都拷贝了过来!呵呵,偶的博客终于支持中文ID了。兴奋ing!不过问题还是没解决,偶还是不能编译成功mod_encoding.so文件。搜遍网络【搜索”生成 mod_encoding.so”】没有找到一篇中文帮助,google人家都急了于是给偶列出了几篇日文的,唉,有比没有好吧,好歹日文里面夹杂着不少的汉字,还是能明白大体意思的。偶就照着日文的编译步骤终于编译成功!hoho......特把步骤中文化一番,步骤大体一致,加入偶个别的一些看法!别拿臭鸡蛋砸我啊!~~偶是菜鸟,没办法!!有什么不对的地方望指正!

原日文网址:http://www.seya.org/mt/archives/2003/10/31_webdav2.html


■ 下载相关文件并解压
WebDAV Resources JP有Apache2对应的mod_encoding的最新版本下载

# 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
# tar zxfv mod_encoding-20021209.tar.gz
# cp mod_encoding.c.apache2.20020616 mod_encoding-20021209/mod_encoding.c

■ iconv_hook编译和安装

安装mod_encoding前首先需要安装iconv_hook。

$ cd mod_encoding-20021209/lib
$ ./configure
$ make
$ su
# make install

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

# vi /etc/ld.so.conf
/usr/local/lib

[Esc]、[:]、[w]、[q] 保存退出。

# PATH="$PATH:/sbin"
# ldconfig

■ apxs工具安装
编译mod_encoding时,必须要有apxs,httpd-devel中包括创建和安装扩展模块的apxs工具。如果是你安装了Apache,检查${APACHE_HOME}/bin/下是否存在apxs,如果存在则略过该步无需自己安装该程序包,如果尚未安装e则需要自己手动安装httpd-devel。

# apt-get install http-devel

■ mod_encoding模块的编译
进入mod_encoding-20021209.tar.gz的解压目录,即mod_encoding-20021209

# ./configure --with-apxs=/usr/sbin/apxs --with-iconv-hook=/usr/local/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







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

■ httpd.confd的設定
这个是我的设置文件,参考的ytang的

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>
( 发表于 2006年03月08日,17:02 ) 固定链接 评论 [8]
反向跟踪 URL: http://blog.51766.com/trackback/zsc/Weblog/1141808884223
评论:

很不错的手册,根据手册一次配置成功!

cp mod_encoding.c.apache2.20020611a-2 mod_encoding-20021209/mod_encoding.c 这句有误,应该是:
cp mod_encoding.c.apache2.20020611 mod_encoding-20021209/mod_encoding.c

如风 发表于 2006年04月06日, 17:00 #

呵呵,你也说错了吧,是cp mod_encoding.c.apache2.20040616 mod_encoding-20021209/mod_encoding.c 其实原文中因为用的版本比较旧,下载时我就更换成了新的版本,后边的忘记给替换掉了,失败!谢谢你的指点啊 其实大家只要知道他的编译过程就OK了.不必过于计较他们的没一句细节!已经修正了原文的错误!呵呵

zhao 发表于 2006年04月06日, 21:42 #

在Apache2.2上Apache的配置文件加上后,启动Apahce时有如下错误:

Syntax error on line 199 of /etc/httpd/conf/httpd.conf: API module structure `encoding_module' in file /etc/httpd/modules/mod_encoding.so is garbled - perhaps this is not an Apache module DSO?

谁遇到过吗?咋整呢?

Root 发表于 2006年08月06日, 19:21 #

老大,按照你的做法,没有生成mod_encoding.o文件,怎么办?

KBS 发表于 2007年01月18日, 15:45 #

你是按照所有的步骤来的吗?应该可以的,我的就很多次都可以!

51766驴友 发表于 2007年01月20日, 19:41 #

在Apache2.2, 为何编绎不了
[root@www mod_encoding-20021209]# make
/usr/local/apache2/bin/apxs -c -I/usr/local/include -liconv_hook mod_encoding.c
/usr/local/apr/build-1/libtool --silent --mode=compile gcc -prefer-pic -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/apache2/include -I/usr/local/apr/include/apr-1 -I/usr/local/apr-util/include/apr-1 -I/usr/local/include -c -o mod_encoding.lo mod_encoding.c && touch mod_encoding.slo
mod_encoding.c: In function `get_client_encoding':
mod_encoding.c:174: warning: assignment makes pointer from integer without a cast
mod_encoding.c:181: error: `regex_t' undeclared (first use in this function)
mod_encoding.c:181: error: (Each undeclared identifier is reported only once
mod_encoding.c:181: error: for each function it appears in.)
mod_encoding.c:181: error: syntax error before ')' token
mod_encoding.c: At top level:
mod_encoding.c:187: error: syntax error before "return"
mod_encoding.c: In function `set_server_encoding':
mod_encoding.c:213: warning: assignment makes pointer from integer without a cast
mod_encoding.c: In function `add_client_encoding':
mod_encoding.c:239: error: `REG_EXTENDED' undeclared (first use in this function)
mod_encoding.c:239: error: `REG_ICASE' undeclared (first use in this function)
mod_encoding.c:239: error: `REG_NOSUB' undeclared (first use in this function)
mod_encoding.c:244: warning: assignment makes pointer from integer without a cast
mod_encoding.c: In function `default_client_encoding':
mod_encoding.c:270: warning: assignment makes pointer from integer without a cast
mod_encoding.c: At top level:
mod_encoding.c:301: warning: initialization from incompatible pointer type
mod_encoding.c:305: warning: initialization from incompatible pointer type
mod_encoding.c:309: warning: initialization from incompatible pointer type
mod_encoding.c:313: warning: initialization from incompatible pointer type
mod_encoding.c:317: warning: initialization from incompatible pointer type
mod_encoding.c: In function `mod_enc_parse':
mod_encoding.c:499: warning: passing arg 2 of `ap_pbase64encode' makes pointer from integer without a cast
mod_encoding.c:501: warning: passing arg 3 of `apr_table_set' makes pointer from integer without a cast
apxs:Error: Command failed with rc=65536
.
make: *** [mod_encoding.so] 错误 1

ann 发表于 2007年01月25日, 17:23 #

楼上的编译错误和我的一样
我也是这样。
apxs:Error: Command failed with rc=65536
这个我就不知道为什么了。 都是这样的毛病?/
是不是我们的APACHE有问题??
还是别的?/

/** *124.114.128.246 */ 51766驴友 发表于 2007年03月06日, 01:46 #

是没有include regex.h的问题。
可以参考:
http://www.cublog.cn/u/1589/showart.php?id=239748

Chenl 发表于 2007年03月07日, 17:45 #

Posted on 2007-04-13 09:40  古代  阅读(2107)  评论(0编辑  收藏  举报