Apache中对 cgi 的配置:
ScriptAlias /cgi-bin/ "E:/work/Apache2.2/cgi-bin/"
<Directory "E:/work/Apache2.2/icons">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
摘 要 该文通过对CGI程序,特别是Windows CGI程序原理的分析,
介绍了用Visual C+ +语言编写CGI程序的方法,并给出了一个用CGI程
序使得WWW服务器与系统数据库相连的例子。
关键词 CGI WWW HTML VC++ 数据库
近年来,Internet与Intranet迅猛发展,企业纷纷建立自己的Intr
anet,以加强企业内部的联系,促进与外部世界的沟通,增强企业的竞
争能力。通过建立自己的Internet服务器,企业能在网络上发布广告,
介绍本公司的情况与产品,收集顾客意见,以及建立虚拟电子商场等。
大家都知道写一个HTML超文本文件放在World Wide Web服务器上,即
可通过各种浏览器访问你的主页,但是如何使你的静态主页能响应客
户的动作,并与本地的数据库联系,将数据库的相应内容传送给远端的
浏览器呢?这就需要通过CGI接口进行联系。
CGI全名是Common Gateway Interface,它是WWW服务器调用外部
程序的接口通过CGI,WW W服务器能完成一些本身所力不能及的工作。
图1表示了CGI与WWW的关系。图1 CGI接口
在不同操作系统下CGI接口也不相同,可分为Standard CGI接口、
DOS CGI接口与Win CG I接口等。Standard CGI接口用于Unix系统,它
是通过环境变量来实现WWW Server与CGI应用程序之间的联系。DOS C
GI接口与Standard CGI接口原理类同。Win CGI接口则与前两者大不
相同。由于越来越多的WWW Server采用Windows系统,而Windows系统
又不能有效地传递环境变量,由Bob Denny提出了一种Windows CGI标
准,并得以不断推广。
Win CGI是通过.ini文件来进行联系的。在Windows环境下,许多
应用程序都是利用.ini 文件,即profile文件来定义一些基本设定,而
Win CGI程序与WWW Server之间也正是通过pro file文件来实现联系
的。当WWW Client通过WWW Server触发CGI程序时,WWW Server先动态
生成几个文件于临时目录下,分别为.ini、.inp、.out等文件。在WWW
Server生成CGI程序的进程时,通过命令行参数将.ini文件的绝对路
径传给CGI进程。.ini文件中也包含了.inp、.ou t等文件路径信息。
这样,CGI程序可读取.ini和.inp文件所提供的信息,了解所有来自WWW
S erver端和与WWW Client端的数据。然后,CGI程序可以调用外部程
序,或由CGI直接执行外部程序的功能,并将要传给客户端的信息以HTM
L文本的形式写在.out文件上。最后,WWW Serve r读取.out文件的HTM
L文本,将信息传送给WWW Client端,并删除临时目录下的文件。
那么,CGI的profile文件包含了什么数据呢?与Windows其它.ini
文件一样,CGI profile 文件包含了许多session,每个session又包含
一些key,以下是一个CGI profile的部份内容
[CGI]
Request Method=POST //传递方式,即HTML中的Form method有
Request Method=POST //传递方式,即HTML中的Form method有
GET,POST,HEAD等。
Server Software=WebSite/1.1e
//Server的名称与版本。
Server Name=199.199.198.55
//Server的IP地址。
Server Port=80//Server的Socket Port。
Server Admin=tomy@vico.bme.zju.edu.cn//Server管理者的E-m
ail地址。
Referer=http://199.199.198.55/
//主页的URL路径。
Remote Address=199.199.198.89
//Client端的IP地址。
[System]
Output File=c:WebSitecgi-temp198ws.out//输出文件的路
径名。
Content File=c:WebSitecgi-temp198ws.inp//输入文件的路
径名。
[Form Literal]
type=B//接收到的Form data即client端动作的结果信息。
原则上可用来编写CGI程序的语言有:perl, AppleScript, Unix
Shell, VB, C/C++等。但在Windows(NT、3x、95)环境下,还是必须借
助成熟的Windows编程语言才能编写出精巧的Win CGI程序。C语言是
一门深受广大程序员喜爱的语言,尤其是VCi++作为一门面向对象的语
言,具备了Windows环境的许多基本功能,如OLE,ODBC等。通过ODBC这
项功能,可以非常容易地连接FoxPro, Access, dBASE等多种数据库,
而无需考虑各种数据库结构的差异。
以下是笔者用VC++4.0编写的一个用Win CGI连接数据库的范例。
使用者可在屏幕上选择,以查询ISP服务商提供的internet服务价格表
。系统环境采用Windows 95,数据库采用FoxP ro2.5, WWW Server采
用Website。
1.建立数据库
本例的CGI程序是通过ODBC连接数据库,因此数据库建完后,应用3
2位ODBC驱动器加以登记。
2.编写HTML程序
使用者可在屏幕上选择一服务类型,再按"提交"键,即可查询这一
服务类型的各价格栏目。其HTML文本描述如下:
<HTML>
<HEAD><TITLE>维科公司internet服务收费标准</TITLE></HEAD>
<pre><H1>维科公司internet服务收费标准</H1>
</P>
<hr><form method="POST" action="cgi-bin/cgi-console.exe">
您要查询的类型是:
<UL><LI>A类用户<input name="usertype" type=radio value="
A">
<LI>B类用户<input name="usertype" type=radio value="B">
<LI>C类用户<input name="usertype" type=radio value="C">
<LI>D类用户<input name="usertype" type=radio value="D">
</UL>
<center>
<input type=submit value="提交"> <input type=reset value
="取消"></center>
</pre></form><hr>
</HTML>
3.编写VC++CGI程序(实际上用一个console程序就行了!)
输入参数从环境变量和stdin中取得,输出数据到stdout
#include <stdio.h>
int main()
{
printf("Content-Type: text/htmlnn"); // 这里一定要有两个回车
printf("<html><body><h1>");
printf("Hello World");
printf("</h1></body></html>");
}
编译后生成cgi-console.exe
或者也可以直接运行脚本,如
http://localhost/cgi-bin/sh.bash
#! E:/work/Cygwin/bin/bash.exe
echo -e "Content-Type: text/htmln" # ‘-e’ enables backslash reinterpreter
echo "<html><body><h1>"
echo "Hello World"
echo "</h1></body></html>
4.结论
将程序编译后,把wincgi.exe拷入website/cgi-win/目录下,用浏
览器查询结果。至此简单地阐述了用VC++编写Win CGI程序的整个过
程,C程序员也可以用自己熟悉的语言编写CGI程序了。利用VC++的强
大功能,你的WWW Server将无所不能。