说明,部分代码来源网络
Form CGI 是什么
这是我自己起的名字。CGI通用网关接口程序,如果不能从客户端浏览器获取参数,将没有任何意义。那么CGI程序如何获取客户端用户输入的参数呢?这里主要依靠HTTP的GET和POST方法,提取HTML的form表单项目,组成name1=value1&name2=value2....格式的字符串。这样的字符串有一个名字叫做URLEndcode,这也是有标准定义的,具体可以百度一下。
Web服务器收到后,将此字符串放入环境变量QUERY_STRING中,CGI程序通过解析QUERY_STRING还原浏览器客户端参数。CGI程序在得到这些参数后,就可以做自己的事情了,做完之后,不要忘了把处理结果返回给浏览器。
ECHO测试
FormCGI ECHO测试就是用户通过浏览器输入什么内容,CGI程序接收后返给用户的内容就是什么。
测试页面
页面测试效果如图1所示,form表单项目有name,email和msg。由于页面HTML代码比较多,可以到这里下载测试:cgi_form.html。
图1
当用户点击Call CGI按钮后,成功将用户输入提交给了cgi_form.sh程序,cgi_form.sh程序最终将用户输入的内容又返回给浏览器。效果如下图2所示。
图2
CGI程序
浏览器网提交给服务器的是这样的字符串:
cgi_form.sh?name=hyx&email=hyx@abc.com&msg=hello+cgi+form&action=Call+CGI
其中cgi_form.sh是CGI程序,用户输入的参数都在里面,cgi_form.sh通过解析上面问号后面的字符串,得到参数值,然后将参数值返回给浏览器。
用Shell脚本解析字符串(URLDecode编码),从网上找到了一个现成的脚本来实现字符串解析。它的名字叫proccgi.sh,可网上搜索下载,也可以去这下载proccgi.sh。
以下是cgi_form.sh的全部内容:
#!/bin/sh
eval `./proccgi.sh $*`
echo "Content-type:text/html"
echo ""
echo "<html>"
echo "<head><title>CGI Form</title></head>"
echo "<body>"
echo "<h2>Server Got you parametes! Right!?^_^</h2>"
echo "<h2>Name :$FORM_name </h2>"
echo "<h2>Email :$FORM_email </h2>"
echo "<h2>Message : $FORM_msg </h2>"
echo "</body>"
echo "</html>"
总结
如果CGI程序要处理用户参数,必须要有解析QUERY_STRING的功能,说的规范点就是必须有符合CGI 1.1规范的解析程序。比如本例中使用到的proccgi.sh就是一个shell脚本处理CGI参数,具体用法已经体现在cgi_form.sh脚本中。
问题&思考
由于我使用的浏览器是win7中文版IE,cgi_form.html也没有指定内容的字符集,IE浏览器打开测试页面cgi_form.html自动选择简体中文。如果通过浏览器输入中文,提交以后会是什么效果呢?
下一遍文章将会对这一问题与思考给出解释与解决方案。