? cgi(公共网关接口[common gateway interface])定义了网站服务器与外部内容协商程序之间交互的方法,通常是指cgi程序或者cgi脚本,是在网站上实现动态页面的最简单而常用的 方法。本文将对如何在apache网站服务器上建立cgi以及如何编写cgi程序作介绍。 配置
?
cgi(公共网关接口[common gateway interface])定义了网站服务器与外部内容协商程序之间交互的方法,通常是指cgi程序或者cgi脚本,是在网站上实现动态页面的最简单而常用的 方法。本文将对如何在apache网站服务器上建立cgi以及如何编写cgi程序作介绍。
配置apache以允许cgi
要让cgi程序能正常运作,必须配置apache以允许cgi的执行,其方法有多种。
scriptalias
scriptalias指令使apache允许执行一个特定目录中的cgi程序。当客户端请求此特定目录中的资源时,apache假定其中文件都是cgi程序并试图运行。
scriptalias指令形如:
scriptalias /cgi-bin/ /usr/local/apache/cgi-bin/
如果apache被安装到默认的位置,默认的配置文件httpd.conf中则会有上述配置。scriptalias指令定义了映射到一个特定目录的url前缀,与alias指令非常相似,两者一般都用于指定位于documentroot目录以外的目录,其区别是scriptalias又多了一层含义,即其url前缀中任何文件都被视为cgi程序。所以,上述例子会指示apache,/cgi-bin/应该指向/usr/local/apache/cgi-bin/目录,且视之为cgi程序。
举例,如果有url为http://www.example.com/cgi-bin/test.pl的请求,apache会试图执行/usr/local/apache/cgi-bin/test.pl文件并返回其输出。当然,这个文件必须存在而且可执行,并以特定的方法产生输出,否则apache返回一个出错消息。
scriptalias目录以外的cgi
由于安全原因,cgi程序通常被限制在scriptalias指定的目录中,如此,管理员就可以严格地控制谁可以使用cgi程序。但是,如果采取了恰当的安全方法措施,则没有理由不允许其他目录中的cgi程序运行。比如,你可能希望用户在userdir指定的宿主目录中存放页面,而他们有自己的cgi程序,但无权存取cgi-bin目录,这样,就产生了运行其他目录中cgi程序的需求。
用options显式地允许cgi的执行
可以在主服务器配置文件中,使用options指令显式地允许特定目录中cgi的执行:
options +execcgi
上述指令使apache允许cgi文件的执行。另外,还必须告诉服务器哪些文件是cgi文件。下面的addhandler指令告诉服务器所有带有cgi或pl后缀的文件是cgi程序:
addhandler cgi-script .cgi .pl
编写cgi程序 编写cgi程序和``常规''程序之间有两个主要的不同。
首先,在cgi程序的所有输出前面必须有一个mime类型的头,即http头,对浏览器指明所接收内容的类型,大多数情况下,形如:
content-type: text/html
其次,输出要求是html形式的,或者是浏览器可以显示的其他某种形式。多数情况下,输出是html形式的,但偶然也会编写cgi程序以输出一个gif图片或者其他非html的内容。
除了这两点,编写cgi程序和编写其他程序大致相同。
第一个cgi程序 这个cgi程序例子在浏览器中打印一行文字。把下列存为first.pl文件,并放在你的cgi-bin目录中。
#!/usr/bin/perl
print content-type: text/html/n/n;
print hello, world.;
即使不熟悉perl语言,你也应该能看出它干了什么。第一行,告诉apache这个文件可以用/usr/bin/perl(或者任何你正在使用的shell)解释并执行。(注意对于windows环境下:1下载windows下的perl解释器activeperl,官方网站:http://www.activestate.com/。我的perl安装路径为:e:/program/devel/perl/bin/perl.exe ,所以要改为此路径,否则apache不能找到此程序解释程序,报500错误。)
第二行,打印上述要求的内容类型说明,并带有两个换行,在头后面留出空行,以示http头的结束。第三行,打印文字``hello, world.''。程序到此结束。
打开你喜欢的浏览器并输入地址:
http://www.example.com/cgi-bin/first.pl
或者是你存放程序的其他位置,就可以在浏览器窗口中看到一行hello, world.。虽然并不怎么激动人心,但是一旦这个程序能正常运作,那么就可能运作其他任何程序。
在apache/cgi-bin/目录里有一些测试例子,我们可能用它来测试下,看看配置是否能正常运行。
比如说apache/cgi-bin/目录下有个test-cgi程序,源码如下:
#!/bin/sh
# disable filename globbing
set -f
echo content-type: text/plain; charset=iso-8859-1
echo
echo cgi/1.0 test script report:
echo
echo argc is $#. argv is $*.
echo
echo server_software = $server_software
echo server_name = $server_name
echo gateway_interface = $gateway_interface
echo server_protocol = $server_protocol
echo server_port = $server_port
echo request_method = $request_method
echo http_accept = $http_accept
echo path_info = $path_info
echo path_translated = $path_translated
echo script_name = $script_name
echo query_string = $query_string
echo remote_host = $remote_host
echo remote_addr = $remote_addr
echo remote_user = $remote_user
echo auth_type = $auth_type
echo content_type = $content_type
echo content_length = $content_length
然后在浏览器里输入http://127.0.0.1/cgi-bin/test-cgi
如果设置正确就能显示如下信息
cgi/1.0 test script report:
argc is 0. argv is .
server_software = apache/2.2.10 (unix) php/5.2.8
server_name = 127.0.0.1
gateway_interface = cgi/1.1
server_protocol = http/1.1
server_port = 50001
request_method = get
http_accept = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
path_info =
path_translated =
script_name = /cgi-bin/test-cgi
query_string =
remote_host =
remote_addr = 127.0.0.1
remote_user =
auth_type =
content_type =
content_length =
当然你也可以选择用其它语言来写一个cgi程序,其中apache提供了一个用pear写的例子。
下面是用c语言写的一个简单的例子。
#include
#include
int main (int argc, char** argv) {
char a[] = -100;
char b[] = 456;
int c;
c = atoi(a) + atoi(b);
char *p;
p = getenv(query_string);
printf(content-type: text/html/n/n);
printf(c=%d,c);
printf(%s,p);
return 0;
}
?
实现功能为:打印打印a+b的值,如果有get参数,同时打印get参数