-
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 服務器。
服務器端 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編寫語言
· Perl (Practical Extraction and Report Language)
· Bourne Shell或者Tcl (Tool Command Language)
· PHP(Hypertext Preprocessor))
由於C語言有較強的平台無關性,所以也是編寫CGI程序的首選。
Windows環境中:
· C和C++
由於Internet上大部分服務器使用的是UNIX操作系統,且幾乎任一UNIX操作系統中都有Bourne Shell,因而大部分實現腳本都是用Bourne Shell編寫的。
最終Perl由於其跨操作系統、易於修改的特性成為了CGI的主流編寫語言,以至於一般的“cgi程序”就是Perl程序。
CGI特點
公共網關接口 CGI 程序是存放在 HTTP 服務器上,為用户和HTTP服務器之外的其他應用程序提供互相“交談”手段的軟件,其特點是:
接口(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程序目錄放在系統中的真實路徑。
⑵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_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的不足。是的,僅僅是補充,不是替代。
它是運行在Web服務器上的一個程序,並由來自於瀏覽者的輸入觸發。CGI是在HTTP服務器下運行外部程序(或網關)的一個接口,它能讓網絡用户訪問遠程系統上的使用類型程序,就好像他們在實際使用那些遠程計算機一樣。
CGI能夠讓瀏覽者與服務器進行交互,如果你曾經遇到過在網絡上填表或者進行搜索,就很有可能就是用的CGI。
儘管CGI易於使用,但是當大批人同時使用一個CGI應用程序是會反應較慢,網絡服務器 速度也會受到很大 影響。CGI應用程序的優點是可以獨立運行。
CGI應用程序可以由大多數的編程語言編寫,如Perl(Practical Extraction and Report Language)、C\C++、Java 和Visual 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的簡要歷史
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 的旗艦企業服務器的站點還多。
- 參考資料
-
- 1. 蘇選良 .管理信息系統 : 電子工業出版社 , 2003年
- 2. 崔承毅,姜相鈞.基於ARM9的嵌入式WEB服務器的研究與設計[J].電子科技,2007(09):64-67. .中國知網[引用日期2019-07-20]
- 3. 張志慧. 嵌入式Web服務器的研究與實現[D].南京郵電大學,2013. .中國知網[引用日期2019-06-21]
- 4. 韋斯特 . 進程與協議 . 叢容譯 . 北京 : 中國電力出版社 , 2000: 421~423
- 5. 唐紅梅,於明,張總成.公共網關接口CGI及其應用:計算機時代,1999:8-9