CGI是什麼
CGI全稱是CommonGateway Interface,簡稱CGI,中文名叫做通用網關接口。
CGI程序就是符合CGI接口規範的程序,相對於WebServer來說也叫外部程序。
CGI接口規範的定義,使得WebSever具備了動態服務功能。客戶端或者瀏覽器通過HTTP協議的GET、POST方法將將form表單數據提交給Web Sever,然後Web Sever 再將客戶端的數據交給CGI程序處理,最後由CGI程序將用戶數據的處理結果返回給Web Sever,Web Sever將處理結果返回給客戶端。
Web Server收到客戶端的數據,怎麼傳遞給CGI程序? CGI程序處理後的結果怎麼傳回給Web Server?這些內容都在CGI規範裏定義了。具體參考http://www.ietf.org/rfc/rfc3875.txt。
CGI程序
CGI程序就是按照CGI規範,從WebServer獲取客戶端數據,然後進行相應處理,將處理結果返回給Web Server。因此CGI程序可以用任何編程語言實現,python,shell,C,java等等。
在linux下,CGI程序通過環境變量QUERY_STRING獲取客戶端數據,具有如下形式:”name1=value1&name2=value2&name3=value3”;CGI程序通過標準輸出(stdout)將處理結果返回給WebServer。
Hello CGI
實現一個最簡單的CGI程序,不處理任何客戶端數據,只簡單返回類似Hello World的頁面。在實現CGI程序之前,需要有一個支持CGI的Web Sever運行起來,這裏使用BOA Web Sever。具體編譯安裝方法請參考文章《boa-0.94.13 Web服務器的編譯與運行》。
BOA 的CGI配置
只需修改一項,具體如下:ScriptAlias/cgi-bin/ /home/hyx/BOA/cgi-bin/
所有的cgi程序需要放入/home/hyx/BOA/cgi-bin/目錄。
假設BOA服務器爲http://192.168.181.100:8080
Shell實現
#!/bin/sh
echo "Content-type:text/html"
echo ""
echo "<html>"
echo"<head><title>cgiShellHello</title></head>"
echo "<body>"
echo '<h1>Hello World! <fontcolor="red">"CGI Shell"</font> </h1>'
echo "</body>"
echo "</html>"
安裝:cp cgiShellHello/home/hyx/BOA/cgi-bin/
測試:瀏覽器訪問http://192.168.181.100:8080/cgi-bin/cgiShellHello
<html>
<head><title>cgiCHello.c</title></head>
<body>
<h1>Hello World! <fontcolor="red">"CGI C"</font> </h1>
</body>
</html>
C實現
#include<stdio.h>
int main(int argc, char** argv)
{
printf("Content-type:text/html\n\n");
printf("<html>\n");
printf("<head><title>cgiCHello.c</title></head>\n");
printf("<body>\n");
printf("<h1>Hello World! <font color=\"blue\">\"CGI C\"</font> </h1>\n");
printf("</body>\n");
printf("</html>\n");
return 0;
}
編譯:gcc –o cgiCHello cgiCHello.c
安裝:cp cgiCHello/home/hyx/BOA/cgi-bin/
測試:瀏覽器訪問http://192.168.181.100:8080/cgi-bin/cgiCHello
<html>
<head><title>cgiCHello.c</title></head>
<body>
<h1>Hello World! <fontcolor="blue">"CGI C"</font> </h1>
</body>
</html>
關鍵點
上面C和 Shell編程實現的CGI程序,一方面說明了CGI程序可以有任意語言編程實現,另一方面也說明了兩點:
一、Web Server與CGI程序通過標準輸出交互信息,C語言的printf和Shell的echo都是標準輸出接口。
二、上述CGI程序返回的的HTML文件,但是在真正的HTML文件之前都有一句Content-type:text/html。Content-type表明了後續的數據是什麼類型,最終到達客戶端瀏覽器時,瀏覽器根據此項指示決定如何處理後面的數據,如果是HTML就顯示HTML頁面。具體Content-type還有哪些內容,google&baidu吧。