CGI的优点是交互,提供表单服务,没有这个,CGI也只和普通的静态网页没有区别。在编写cgi-bin的时候,有几点需要特别的注意:
1、网页的标头:非常重要
printf("Content-type:text/html/n/n");
2个换行,否则BOA不认,当然,具体类型参考资料。
2、cookie格式
为此郁闷了好久,主要是cookie的时间格式,必须按照标准来,否则使用过期时间后不认,导致无法注销cookie
time_t now;
struct tm *loctm;
char *wday[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
char *mon[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
time(&now);
loctm=localtime(&now);
printf("Set-Cookie:Name=%s;Expires=%s,%d-%s-%d %d:%d:%d GMT/r/n",usr,wday[loctm->tm_wday],loctm->tm_mday,mon[loctm->tm_mon]
,loctm->tm_year+1900,loctm->tm_hour,loctm->tm_min,loctm->tm_sec);
printf("Content-type:text/html/n/n");
而且cookie应该打在标头的前一行。当时间设置正确即生效,设置已经过去的时间,则为注销cookie。
3、集成处理的cgi(我自己提的名词)
也就是提交给自己处理的cgi-bin文件。其实实现方法很简单,在输出打印网页之前首先判断环境变量是否存在值,有则首先处理,然后打印。
流程大概是这样的:
显示网页
↓
修改提交
↓
处理→提交给自己,重新加载cgi-bin一次,并进行处理
↓
写入文件
↓
读取文件
↓
显示网页
即在显示前加上:
if(getenv("CONTENT_LENGTH"))
或
if(getenv("QUERY_STRING"))
同样,还可以活用,就是首先用QUERY_STRING读取当作某个参数,然后可以有选择的对CONTENT_LENGTH进行处理,这里就不延伸下去了。