說明,部分代碼來源網絡
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 protected]&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自動選擇簡體中文。如果通過瀏覽器輸入中文,提交以後會是什麼效果呢?
下一遍文章將會對這一問題與思考給出解釋與解決方案。