原文:http://blog.donews.com/mutecat/archive/2006/10/28/1068602.aspx
其实大一的时候就开始接触CGI了,CGI(Common Gateway Interface: 公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准,由此可见,CGI程序需要httpd服务器的支持。Linux下比较流行用perl和php来写CGI程序,CGI程序需要大量的字符处理工作,perl和php对字符的处理都非常简单。但是有时也用C语言或者其他一些语言来写,C语言写CGI相对比较复杂,大家知道C对字符串的处理是相当复杂的,但是用C语言编写的CGI程序具有执行速度快、安全性高等特点。
CGI接口标准包括标准输入、环境变量、标准输出三部分。
1.标准输入
CGI程序像其他可执行程序一样,可通过标准输入(stdin)从Web服务器得到输入信息,如Form中的数据,这就是所谓的向CGI程序传递数据的POST方法。这意味着在操作系统命令行状态可执行CGI程序,对CGI程序进行调试。
2.环境变量
操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了自己的一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法还通过 环境变量QUERY-STRING向CGI程序传递Form中的数据。
3.标准输出
CGI程序通过标准输出(stdout)将输出信息传送给Web服务器。传送给Web服务器的信息可以用各种格式,通常是以纯文本或者HTML文本的形式,这样我们就可以在命令行状态调试CGI程序,并且得到它们的输出。
从上面可以看出CGI获取input的方法有两种:环境变量(get),读stdin(post)
下面是CGI程序设计中常常要用到的一些环境变量。
HTTP-REFERER:调用该CGI程序的网页的URL。
REMOTE-HOST:调用该CGI程序的Web浏览器的机器名和域名。
REQUEST-METHOD:指的是当Web服务器传递数据给CGI程序时所采用的方法,分为GET和POST两种方法。GET方法仅通过环境变量(如QUERY-STRING)传递数据给CGI程序,而POST方法通过环境变量和标准输入传递数据给CGI程序,因此POST方法可较方便地传递较多的数据给CGI程序。
SCRIPT-NAME:该CGI程序的名称。
QUERY-STRING:当使用GET方法时,Form中的数据最后放在QUERY-STRING中,传递给CGI程序。
CONTENT-TYPE:传递给CGI程序数据的MIME类型,通常为″applica tion/x-www-form-url encodede″,它是从HTML Form中以POST方法传递数据给CGI程序的数据编码类型,称为URL编码类型。
CONTENT-LENGTH:传递给CGI程序的数据字符数(字节数)。
CGI处理的C语言程序大概如下:
n=atoi(getsenv("CONTENT_LENGTH")); //获取传递给程序的字节数
if(n>5000000) n=5000000;
buf=calloc(n+1, 1);
if(buf==0) http_fatal("memory overflow");
fread(buf, 1, n, stdin); //从标准输入读取数据(post)
buf[n]=0;
t2=strtok(buf, "&"); // 的确是post,进行数据处理
while(t2) {
t3=strchr(t2, ‘=’);
if(t3!=0) {
t3[0]=0;
t3++;
__unhcode(t3);
parm_add(trim(t2), t3);
}
t2=strtok(0, "&");
}
strsncpy(buf2, getsenv("QUERY_STRING"), 1024); //从环境变量里面获取数据(get)
t2=strtok(buf2, "&"); //的确是get,进行数据处理
while(t2) {
t3=strchr(t2, ‘=’);
if(t3!=0) {
t3[0]=0;
t3++;
__unhcode(t3);
parm_add(trim(t2), t3);
}
t2=strtok(0, "&");
}
参考文档: