Apache一个BUG

      今天把lighttpd换成Apache(别问我原因),于是下载了httpd-2.2.9.tar.bz2回来编译。

     
由于有很多文献要读,我在这个http
server上建了一个目录,然后用脚本定时将实验室机器上的Paper同步到这个目录上,再在俺的MacBook上用另一个脚本下载回寝室。为了阅读方便,这个http
server上存放文献的目录开着Index。但是今天发现autoindex模块无法在Linux系统上显示中文文件名。于是在Firefox里面查看了一下Index页面的信息,发现发送编码居然是ISO-8859-1,也就是Western西方字符编
码。这就奇怪了,我明明在httpd.conf里指定了AddDefaultCharset UTF-8的啊。。。。

      于是我打开autoindex模块的源代码,modules/generators/mod_autoindex.c,发现其中是这样判断编码的:

      if (autoindex_conf->ctype) {         
          ctype = autoindex_conf->ctype; 
      }                                     
      if (autoindex_conf->charset) {       
         charset = autoindex_conf->charset;
      }                                    
      else {                            
  #if APR_HAS_UNICODE_FS             
          charset = "UTF-8";            
  #else
          charset = "ISO-8859-1";
  #endif
      }
  
      所以使用ISO-8859-1貌似是因为编译时预处理else中的判断结构出现了错误。那么APR_HAS_UNICODE_FS是个什么东西呢?查了一下,APR是Apache Portable
Runtime(Apache可移植运行库)的缩写,这是一个用来保证上层程序可以跨平台编译运行的中间层。APR_HAS_UNICODE_FS是在srclib/apr/include/apr.h中定义的,而这个apr.h则是在configure时srclib/apr/include/apr.h.i生成的:在Windows下APR_HAS_UNICODE_FS=1,而在Linux及Unix下APR_HAS_UNICODE_FS=0,然后根据APR_HAS_UNICODE_FS的值,在编译autoindex模块时选择采用ISO-8859-1或者UTF-8编码。

      这下问题就很明白了,这个http server系统是RHEL
5,locale是UTF-8,这样的话正好与mod_autoindex.c的初衷相违背:只要是在Linux系统下编译时,不管系统locale如何
设置都使用ISO-8859-1编码生成Index。
   
      目前几乎所有主流Linux发行版的默认locale几乎清一色都是UTF-8,但是Apache中的autoindex_module非但不能判断locale采用相应的编码,反而不分青红皂白就用了ISO-8859-1编码。。。。这实在是。。。太汗了。

    嗯,有时候Hacking一下软件还是很有意思的。

Author: armadillo

傻傻的笨蛋,什么都不懂的Small Kids,总是在幻想,轻轻地走来,静静地站在那里,默默地看着一切,细细地思考,然后悄悄地离开……永远都不愿意留在这里……You mustn't allow yourself to be chained to fate, to be ruled by your genes. Human beings can choose the kind of life that they want to live. What's important is that you choose life... and then live.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.