Eros Live ? Use PassEnv to Pass Environment V...

来源:百度文库 编辑:神马文学网 时间:2024/10/05 07:25:19

今天在迁移服务器的时候遇到一个很诡异的问题,原来一切正常的程序在新的服务器上中文乱码。

一段 ruby 写的 cgi script 通过 DBI 访问 oracle 数据库, 将查询得到的记录输出到页面。数据库编码是 gbk, 需要通过 Iconv.conv('utf-8', 'gbk', str) 将字符串转换成 utf-8 输出。oracle 相关的环境变量已经设置好。

export LANG=zh_CN.UTF-8
export NLS_LANG=American_America.zhs16cgb231280
export ORACLE_HOME=/home/oracle/oracle/product/10.2.0/client_1
export LD_LIBRARY_PATH=/home/oracle/oracle/product/10.2.0/client_1/lib:$LD_LIBRARY_PATH

在 shell 里执行该 cgi script 中文能够正常显示,但是通过 apache (非root, oracle用户)执行却出现乱码,而且在 apache 下中文都变成了问号。

初步判断是数据库中的字符在目标字符集下没有对应的代码,通常情况就是 iso-8859-1, 那么估计是设置的 oracle 客户端字符集环境变量没有被带到 apache 执行环境中。在网上 google 到如下:

see http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_env.html#passenv

PassEnv 指令

说明
传送shell中的环境变量

语法
PassEnv env-variable [env-variable] ...

作用域
server config, virtual host, directory, .htaccess

覆盖项
FileInfo

状态
基本(B)

模块
mod_env

从调用httpd进程所在的shell中,指定一个或者更多个环境变量,传送到CGI脚本和SSI页面。例如:

示例

PassEnv LD_LIBRARY_PATH

SetEnv 指令

说明
设置环境变量

语法
SetEnv env-variable value

作用域
server config, virtual host, directory, .htaccess

覆盖项
FileInfo

状态
基本(B)

模块
mod_env

设置一个环境变量,该变量将会传送到CGI脚本和SSI页面。例如:

示例

SetEnv SPECIAL_PATH /foo/bin

这样在 $APACHE_HOME/conf/httpd.conf 中加入

PassEnv ORACLE_HOME
PassEnv LD_LIBRARY_PATH
PassEnv LANG
PassEnv NLS_LANG


SetEnv LANG zh_CN.UTF-8
SetEnv NLS_LANG American_America.zhs16cgb231280
SetEnv ORACLE_HOME /home/oracle/oracle/product/10.2.0/client_1
SetEnv LD_LIBRARY_PATH /home/oracle/oracle/product/10.2.0/client_1/lib:$LD_LIBRARY_PATH

问题都得到了解决