複製鏈接
請複製以下鏈接發送給好友

CGI

(通用網關接口)

鎖定
公共網關接口Common Gateway Interface,CGI)是Web 服務器運行時外部程序的規範,按CGI 編寫的程序可以擴展服務器功能。CGI 應用程序能與瀏覽器進行交互,還可通過數據API數據庫服務器外部數據源進行通信,從數據庫服務器中獲取數據。格式化為HTML文檔後,發送給瀏覽器,也可以將從瀏覽器獲得的數據放到數據庫中。幾乎所有服務器都支持CGI,可用任何語言編寫CGI,包括流行的C、C ++、Java、VB 和Delphi 等。CGI分為標準CGI和間接CGI兩種。標準CGI使用命令行參數或環境變量表示服務器的詳細請求,服務器與瀏覽器通信採用標準輸入輸出方式。間接CGI又稱緩衝CGI,在CGI程序和CGI接口之間插入一個緩衝程序,緩衝程序與CGI接口間用標準輸入輸出進行通信 [1] 
中文名
公共網關接口
外文名
Common Gateway Interface
學    科
計算機科學
功    能
用來解釋處理來自表單的輸入信息
類    別
標準CGI和間接CGI
定    義
Web 服務器運行時外部程序的規範

CGI簡介

CGI(Common Gateway Interface公共網關接口,是外部擴展應用程序與 Web 服務器交互的一個標準接口。它可以使外部程序處理www上客户端送來的表單數據並對此作出反應, 這種反應可以是文件、 圖片、 聲音、 視頻等,可以在瀏覽器窗體上出現的任何數據 [5] 服務器端與客户端進行交互的常見方式多,CGI 技術就是其中之一。根據CGI標準,編寫外部擴展應用程序,可以對客户端瀏覽器輸入的數據進行處理,完成客户端與服務器的交互操作。CGI規範定義了Web服務器如何向擴展應用程序發送消息,在收到擴展應用程序的信息後又如何進行處理等內容。對於許多靜態的HTML網頁無法實現的功能,通過 CGI可以實現,比如表單的處理、對數據庫的訪問、搜索引擎、基於Web的數據庫訪問等等。使用CGI實現客户端與服務器的交互有以下幾個標準步驟,具體步驟如下:
(1)Web 客户端的瀏覽器將URL的第一部分解碼與Web服務器相連。
(2)Web 瀏覽器將URL的其餘部分提供給服務器。
(3)Web 服務器將URL轉換成路徑和文件名。
(4)Web 服務器發送 HTML 和別的組成請求頁面的文件給客户。一旦頁面內容傳送完,
這個連接自動斷開。
(5)在客户端,HTML腳本提示用户做動作或輸入。當用户響應後,客户請求Web服務器建立一個新的連接。
(6)Web 服務器把這些信息和別的進程變量傳送給由HTML以URL的形式指定CGI程序。
(7)CGI 根據輸入作出響應,把響應結果傳送給 Web 服務器。
(8)Web 服務器把響應的數據傳給客户,完成後關閉連接。 [2] 
服務器端 CGI 程序接收信息有三種途徑:環境變量、命令行和標準輸入。其中環境變量是指 CGI 定義一組環境變量,通過環境變量可傳遞數據。服務器收到來自瀏覽器的數據,調用 CGI 腳本,CGI 腳本將收到的數據轉換成環境變量並從中取出所需要的內容。<form>標籤的 METHOD 屬性來決定具體使用哪一種方法。在“METHOD=GET”時,向 CGI 傳遞表單編碼信息的是通過命令來進行的。表單編碼信息大多數是通過環境變量 QUERY_STRING 來傳遞的。若“METHOD=POST”,表單信息通過標準輸入來讀取。還有一種不使用表單就可以向 CGI 傳送信息的方法,那就是把信息直接附在 URL 地址後面,信息和URL 之間用問號(?)來進行分隔。GET 方法是對數據的一個請求,被用於獲得靜態文檔。GET 方法通過將發送請求信息附加在 URL 後面的參數。當 GET 方法被使用時,CGI 程序將會從環境變量 QUERY_STRING獲取數據。為了正確的響應客户端發來的請求,CGI 必須對 QUERY_STRING 中的字符串進行分析。當用户需要從服務器獲取數據,但服務器上的數據不得改變時,應該用 GET 方法;但是如果請求中的字符串超過了一定長度,通常是 1024 字節,那麼這時,只能用 POST 方法。POST 方法:瀏覽器將通過填寫表單將數據傳給服務器時一般採用POST 方法。在發送的數據超過 1024 字節時必須採用 POST 方法。當 POST 方法被使用時,Web 服務器向CGI 程序的標準輸入 STDIN 傳送數據。環境變量 CONTENT_LENGTH 存放着發送的數據長度。CGI 程序必須檢查環境變量 REQUEST_METHOD 以確定有沒有采用了 POST 方法,並決定是否要讀取標準輸入STDIN [3] 

CGI編寫語言

CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變量。對初學者來説,最好選用易於歸檔和能有效表示大量數據結構的語言,例如UNIX環境中:
· Perl (Practical Extraction and Report Language)
· PHP(Hypertext Preprocessor))
由於C語言有較強的平台無關性,所以也是編寫CGI程序的首選。
Windows環境中:
· C和C++
由於Internet上大部分服務器使用的是UNIX操作系統,且幾乎任一UNIX操作系統中都有Bourne Shell,因而大部分實現腳本都是用Bourne Shell編寫的。
最終Perl由於其跨操作系統、易於修改的特性成為了CGI的主流編寫語言,以至於一般的“cgi程序”就是Perl程序。

CGI特點

公共網關接口 CGI 程序是存放在 HTTP 服務器上,為用户和HTTP服務器之外的其他應用程序提供互相“交談”手段的軟件,其特點是:
公共(Common)。無須考慮客户機和服務器所運行的操作系統平台,只要二者的網關程序遵循同一數據傳輸協議,即可進行數據交互。
網關(Gateway)。CGI 可被用來作為 HTTP 服務器與其他第三方應用程序之間的“連接件”或“中件(Middle Ware) "。
接口(Interface)。CGI 使用標準通訊機制,為其它應用程序與 HTTP 服務器提供數據傳輸接口。用 CGI 可以實現處理表格,數據庫查詢,發送電子郵件或控制服務器端硬件等許多操作。
CGI 進程是根據 WWW 服務設置的環境變量和傳入參數採取動作並生成相應的響應結果。它返回給 WWW 服務器的信息則採用協議規定的格式(一般為MIME 規定的格式)。絕大多數 Web 服務器支持 CGI。
按照數據通信方式的不同,CGI 可分為標準 CGI 和緩衝 CGI。幾乎所有的 Web服務器都支持標準 CGI。按標準 CGI 規範編制的外部程序並依賴於特定的 Web 服務器平台,而按緩衝CGI 規範編制的外部程序則依賴於特定的 Web 服務器平台 [4] 

CGI服務器配置

CGI程序不是放在服務器上就能順利運行,如果要想使其在服務器上順利的運行並準確的處理用户的請求,則須對所使用的服務器進行必要的設置。
配置:根據所使用的服務器類型以及它的設置把CGI程序放在某一特定的目錄中或使其帶有特定的擴展名。
⑴CERN格式服務器的配置:
編輯CERN格式服務器(起初其被命名為“CERN httpd”, 也被稱為“W3C httpd”)的配置文件(通常為/etc/httpd.conf)在文件中加入:Exec cgi-bin/*/home/www/cgi-bin/*.exec。命令中出現的第一個參數cgi-bin/*指出了在URL中出現的目錄名字,並表示它出現在系統主機後的第一個目錄中,如:http://edgar.stern.nyn.***/cgi-bin/。命令中的第二個參數表示CGI程序目錄放在系統中的真實路徑。
CGI目錄除了可以跟網絡文件放在同一目錄中,也可以放在系統的其它目錄中,但必須保證在你的系統中也具有同樣的目錄。在對服務器完成設置後,須重新啓動服務器(除非HTTP服務器是用inetd啓動的)。
⑵NCSA格式服務器的配置
在NCSA格式服務器上有兩種方法進行設置:
①在srm.conf文件(通常在conf目錄下)中加入:Script Alias/cgi-bin/cgi-bin/。Script Alias命令指出某一目錄下的文件是可執行程序,且這個命令是用來執行這些程序的;此命令的兩個參數與CERN格式服務器中的Exec命令的參數的含意一樣。
②在srm.conf文件加入:Add type application/x-httpd-cgi.cgi。此命令表示在服務器上增加了一種新的文件類型,其後第一個參數為CGI程序的MIME類型,第二個參數是文件的擴展名,表示以這一擴展名為擴展名的文件是CGI程序。
在用上述方法之一設置服務器後,都得重新啓動服務器(除非HTTP服務器是用inetd啓動的)。

CGI環境變量列表

SERVER_NAME:運行CGI序為機器名或IP地址
SERVER_INTERFACE:WWW服務器的類型,如:CERN型或NCSA型。
SERVER_PROTOCOL:通信協議,應當是HTTP/1.0。
SERVER_PORT:TCP端口,一般説來web端口是80。
HTTP_ACCEPT:HTTP定義的瀏覽器能夠接受的數據類型
HTTP_REFERER:發送表單的文件URL。(並非所有的瀏覽器都傳送這一變量)
HTTP_USER-AGENT:發送表單的瀏覽的有關信息。
GETWAY_INTERFACE:CGI程序的版本,在UNIX下為 CGI/1.1。
PATH_TRANSLATED:PATH_INFO中包含的實際路徑名。
PATH_INFO:瀏覽器用GET方式發送數據時的附加路徑。
SCRIPT_NAME:CGI程序的路徑名。
QUERY_STRING:表單輸入的數據,URL中問號後的內容。
REMOTE_HOST:發送程序的主機名,不能確定該值。
REMOTE_ADDR:發送程序的機器的IP地址。
REMOTE_USER:發送程序的人名。
CONTENT_TYPE:POST發送,一般為application/xwww-form-urlencoded。
CONTENT_LENGTH:POST方法輸入的數據的字節數。

CGI優點

CGI可以為我們提供許多HTML無法做到的功能。比如 a.一個記數器 b.顧客信息表格的提交以及統計 c.搜索程序 d.WEB數據庫,用Html是沒有辦法記住客户的任何信息的,就算用户願意讓你知道。用Html也是無法把信息記錄到某一個特定文件裏的。要把客户端的信息記錄在服務器的硬盤上,就要用到CGI。這是CGI最重要的作用,它補充了Html的不足。是的,僅僅是補充,不是替代。
使在網絡服務器下運行外部分應用程序(或網關)成為可能。CGI-BIN 目錄是存放CGI腳本的地方。這些腳本使Web服務器和瀏覽器能運行外部程序,而無需啓動另一個程序。
它是運行在Web服務器上的一個程序,並由來自於瀏覽者的輸入觸發。CGI是在HTTP服務器下運行外部程序(或網關)的一個接口,它能讓網絡用户訪問遠程系統上的使用類型程序,就好像他們在實際使用那些遠程計算機一樣。
CGI能夠讓瀏覽者與服務器進行交互,如果你曾經遇到過在網絡上填表或者進行搜索,就很有可能就是用的CGI。
儘管CGI易於使用,但是當大批人同時使用一個CGI應用程序是會反應較慢,網絡服務器 速度也會受到很大 影響。CGI應用程序的優點是可以獨立運行。
CGI應用程序可以由大多數的編程語言編寫,如Perl(Practical Extraction and Report Language)、C\C++、JavaVisual Basic等。不過對於那些沒有太多編程經驗的網頁製作人來説,實在是一個不小的難題。

CGI注意的問題

CGI應用程序運行在瀏覽器可以請求的服務器系統上,執行時需要使用服務器CPU時間和內存。如果有成千上萬的這種程序會同時運行,那會對服務器系統提出極高的要求。你要慎重考慮這個問題,以防止服務器系統崩潰
不完善的CGI應用程序可能成為別人非法進人服務器系統的通道,有可能導致重要的資料被刪除或外泄。CGI應用程序主要的用途有以下幾種:
根據瀏覽者填寫的HTML表單發送定製的答覆;
創建可單擊的圖像縮小圖;
創建一個瀏覽者可以搜索內容的數據庫;
提供服務器與數據庫的接口,並把結果轉換成HTML文檔;
製作動態HTML文擋。
如果一個CGI腳本可以在每台計算機上做同樣的事情;編寫腳本就會變的很容易。不幸的是,CGI腳本依賴於服務器的操作系統,因此,對於非UNIX服務器來説,Prl(UNIX下編寫腳本的一個常用工具)腳本毫無用處。所以,你必須定製安裝你的CGI腳本。
大多數服務器都提供CGI-BIN目錄,但是這還不夠。因為你應該擁有自己的CGI-BIN。這樣,你就能運行自己的腳本(而不是讓自己的系統去適應已存在於系統上的腳本)。因此,你的提供商應安裝CGI-BIN,且能夠幫助你編寫腳本

CGIASP

ASP(Active Server Pages):活動服務器頁面,就是一個編程環境,在其中,可以混合使用HTML、腳本語言以及組件來創建服務器端功能強大的Internet應用程序。如果你以前創建過一個站點,其中混合了HTML、腳本語言以及組件,你就可以在其中加入ASP程序代碼。通過在HTML頁面中加入腳本命令,你可以創建一個HTML用户界面,並且,還可以通過使用組件包含一些商業邏輯規則。組件可以被腳本程序調用,也可以由其他的組件調用。
ASP的工作原理:
當在Web站點中融入ASP功能後,將發生以下事情:
1、用户調出站點內容,默認頁面的擴展名是.asp
2、瀏覽器從服務器上請求ASP文件。
3、服務器端腳本開始運行ASP。
4、ASP文件按照從上到下的順序開始處理,執行腳本命令,執行HTML頁面內容。
5、頁面信息發送到瀏覽器。
因為腳本是在服務器端運行的,所以Web服務器完成所有處理後,將標準的HTML頁面送往瀏覽器。這意味着,ASP只能在可以支持的服務器上運行。讓腳本駐留在服務器端的另外一個益處是:用户不可能看到原始腳本程序的代碼,用户看到的,僅僅是最終產生的HTML內容。
PHP:Hypertext Preprocessor
PHP 是一種服務器端的,嵌入HTML的腳本語言。PHP區別其他像客户端Javascript的地方是它的代碼在服務器端執行.PHP能做什麼?
最低水平,PHP可以做任何其他CGI程序所能做的事,例如收集表格數據,生成動態頁面內容,或者收發cookies.可能最強大,最有意義的特性是PHP支持大範圍的數據庫。書寫一個支持數據庫的Web 頁面是難以置信的簡單。
下面是當前支持的數據庫:
Adabas D InterBase Solid
dBase mSQL Sybase
Empress MySQL Velocis
FilePro Oracle Unix dbm
Informix PostgreSQL
PHP通過協議也支持與其他服務的"交談",像IMAP、SNMPNNTPPOP3,甚至是 HTTP。你也可以打開晦澀的 網絡接口和其他協議交互。
PHP的簡要歷史
1994年秋季,Rasmus Lerdorf 開始構思 PHP。早期的非發行版本被用在他的主頁上,以追蹤誰在看他的在線簡歷。1995年年初第一版本出台,當時PHP只被認為是個人主頁開發工具。它由一個非常單純的只能理解很少數特殊宏的分析引擎和 一些用在主頁後端通用的工具組成,如留言簿,計數器和其他一些東西。這個分析器在1995年年中被重寫並被命名為 PHP/FI 第二版。FI來自 Rasmus 寫的另外一個包,用於解釋 html 形式的數據.他結合了個人主頁工具腳本和形式解析器,並加 上mSQL支持.這樣就產生 PHP/FI 了. PHP/FI以令人驚奇的步調成長,人們開始把自己的代碼貢獻給它。
很難給出它的硬統計表,但可以估計在1996年末,整個世界至少有15,000個網站在用PHP/FI。到1997年年中,這個數字已經超過50,000了,而在此時PHP的發展也發生了變化。由Rasmus自己偏愛的和幾個人開發的項目變成一個更有組織的團 體成就。Zeev Suraski和Andi Gutmans重寫了解析器。這個新的解析器成為PHP版本3的基礎。許多有用的代碼從PHP/FI 繼承到PHP3,並且很多是完全重寫的。
不管是PHP/FI或PHP3與很多商業產品捆綁在一塊,例如C2級強度的Web服務器和紅帽子Linux。根據NetCraft提供的數據推斷,保守估計全世界應用PHP的網站已超過150,000個。由此看來,它比在因特網上運行Netscape 的旗艦企業服務器的站點還多。
參考資料