1. 通用网关接口 CGI 简介<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

通用网关接口 CGI 是一个信息服务器主机对外信息服务的标准接口。 CGI 接收用户的要求, 然后让服务器完成请求,并将执行结果返回给用户。

CGI 接口是为了提供在超文本 HTML 的文件编写时,可以结合其他外部的程序语言,让使用 者通过浏览器将使用者的数据输入到文件里,然后经服务器转呈现于其他用户来观赏或记录至 服务器主机上的数据库里。

CGI 可以通过 C C++ Perl Shell 脚本语言、 Jave 来实现。后面的一些具体技术从某种意义 上来说也是一种 CGI 程序。

2. 配置 Apache 支持 CGI

如何使 Apache 能处理 CGI 请求?必须通过相应的配置过程告知 Apache 在哪里存储 CGI 程序, 指明 CGI 程序的扩展等,以下我们逐一介绍设置的内容与步骤。

(1) 创建存储 CGI 程序的目录

创建集中的 CGI 程序目录只是建立 CGI 环境的开始。如果要考虑提高安全性,应将集中的

CGI 程序目录保存在 DocumnentRoot 目录外,使访问者不能直接访问 CGI 程序。

1) DocumentRoot 目录外创建一个目录,然后将所有的 CGI 程序都集中存放在这个目录下。

例如,可创建一个 /home/httpd/public/apps 的目录作为 CGI 程序的大本营。

2) CGI 程序目录创建别名,也就是编辑配置文件 httpd.conf ,加入:


ScriptAlias  /cgi-bin/  /home/httpd/public/apps


之后,当客户访问 www.xxx.com/cgi-bin/li.cgi 时, WEB 服务器会自动执行 WEB 服务器上的 /home/httpd/public/apps/li.cgi 文件。

3) CGI 目录设置合适的权限,一般是只允许 Apache 有读取和执行的权限但没有写的权限。

(2) 允许用户访问 cgi-bin

如果用户需要使他的主页更具有活力,往往 会向你申请 cgi-bin 访问服务。下面介绍 Apache 服务器为用户提供的两种 cgi-bin 访问方法。

a) 使用 Directory DirectoryMatch 容器
当在配置文件 srm.conf 中使用 UserDir 命令定义一个目录时, Apache 会把该目录作为用户 WWW 站点的顶层目录。例如:

UserDir  Public_html


Apache 接到 www.xxx.com/~user 的请求,就到 /home/user/Public_html 取出主页发送给客户。 如果要为每个用户添加 CGI 支持,就在 Apache 的配置文件 access.conf 中添加下列配置:
<DirectoryMatch "/home/[a-z]+/public_html/cgi-bin">

Options ExecCGI

AddHandler cgi-script .cgi .pl

</DirectoryMatch>

注意 将DirectoryMatch换成Directory亦可

在这种方法中, Apache服务器将 www.xxx.com/~user/cgi-bin请求翻译成为了 /home/user/  Public_html/cgi-bin/,并允许执行任何带有正确扩展名 (.cgi.pl)CGI程序。

b. 使用 ScriptAliasMatch 命令

通过使用 ScriptAliasMatch 命令,可以为每个用户添加 CGI 支持。例如:

ScriptAliasMatch ~([a-z]+)/cgi-bin/(.*) /home/$1/public_html/cgi-bin/$2

这个命令将用户名与 $1 相匹配,其中 $1 ~([a-z]+) 相等。将 /cgi-bin/ 后面的任何内容与 $2 匹配,其中 $2 (.*) 相等。

这个设置也实现了将 www.xxx.com/~user/cgi-bin/xxx.cgi 请求解释为:

/home/user/Public_html/cgi-bin/xxx.cgi

大家想一想,如果想将这个请求解释为:

/home/httpd/public/apps/xxx.cgi

该如何设置呢?对,应该是:

ScriptAliasMatch ~([a-z]+)/cgi-bin/(.*) /home/httpd/public /apps/$2