CGI腳本

(圖)CGI腳本CGI腳本

新的網站設計人員在建立網站之後經常問到一個問題就是:“什麼是CGI腳本,如何在我的網站上使用它?”或“如何在我的網站上創建互動式表單?”。
在本文中,我們將回答有關CGI腳本的問題,並演示如何創建自己的腳本。
在此過程中,您還將了解有關Web伺服器的一些知識。讓我們開始吧!

WEB伺服器

(圖)CGI腳本CGI腳本

如Web伺服器工作原理一文中所述,Web伺服器相當簡單。從根本上說,Web伺服器只是從磁碟中檢索出檔案,並通過網路將其傳送到發出請求的瀏覽器。假設您鍵入URL:http://www.bygpub.com/books/tg2rw/author.htm。Web伺服器將會獲得一個針對檔案/books/tg2rw/author.htm的請求。查看下圖,您可以了解伺服器是如何解決該請求的:
在安裝過程中,Web伺服器已被告知c:My Documentswww是伺服器的根目錄。然後,該伺服器會從根目錄中找出/books/tg2rw/author.htm。當您請求URL http://www.bygpub.com/books/tg2rw/時,該伺服器就會知道您正在查找該目錄的默認檔案。它會查找一些不同的檔案名稱以試圖找到默認檔案:index.html、index.htm、default.html和default.htm。根據伺服器的不同,它也可以查找其他檔案名稱。因此,該伺服器會將 http://www.bygpub.com/books/tg2rw/轉換為 http://www.bygpub.com/books/tg2rw/index.htm並傳送該檔案。所有其他檔案必須通過明確給出檔案名稱來指定。

這就是所有Web伺服器處理靜態檔案的方式。大多數Web伺服器還可以通過稱作通用網關接口(CGI)的機制處理動態檔案。您已經在Web上的各種地方看到過CGI,只不過您當時可能對它並不了解。例如:

您可以在任何留言簿上通過HTML表單輸入訊息,當下一次查看此留言簿時,頁面將會包含您輸入的新條目。

Network Solutions

上的WHOIS表單允許您在表單上輸入域名,返回的網頁將根據輸入的域名而有所不同。

任何搜尋引擎都允許您在HTML表單上輸入關鍵字,然後它將根據您輸入的關鍵字動態創建頁面。
所有這些動態頁面使用的都是CGI。

CGI機制

(圖)CGI腳本CGI腳本

在大多數Web伺服器上,通過以下方式使CGI機制標準化。在伺服器視為根目錄的普通目錄樹中,可以創建一個名為cgi-bin的子目錄。(可以在上一頁的圖示中查看此目錄。)然後,伺服器了解到不應只是讀取和傳送從特殊cgi-bin目錄中請求的任何檔案,而應執行它們。執行的程式的輸出內容是它實際傳送給請求該頁的瀏覽器的內容。一般來說,可執行程式既可以是一個純可執行程式(就像C編譯器的輸出),也可以是一個PERL腳本。PERL是一種用於CGI腳本的最流行的語言。
假設您在瀏覽器中鍵入URL:http://www.howstuffworks.com/cgi-bin/search.pl。由於伺服器了解到search.pl位於cgi-bin目錄中,因此它會執行search.pl(一個PERL腳本),並將執行的輸出內容傳送到瀏覽器。

您可以編寫自己的腳本並試驗CGI,前提是:

您了解某種程式語言,如C或PERL。

您對處理CGI腳本的Web伺服器擁有訪問許可權。如果您已為用於承載您的網站的Web託管服務付費,則可以選擇通過您的主機來訪問CGI腳本。有關詳細信息,請查看託管服務。如果您沒有為用於承載您的網站的Web主機服務付費,則可以通過在家用計算機上安裝Web伺服器並學習如何使用它來進行試驗。儘管第二種選擇要稍微複雜一些,但您在此過程中肯定可以學到很多知識!

簡單的CGI腳本

(圖)CGI腳本CGI腳本

假定您對cgi-bin目錄擁有訪問許可權(請參閱上一節),了解C程式語言或PERL,則可以使用CGI執行一系列有趣的試驗。讓我們從創建最簡單的CGI腳本開始。
在網頁基礎知識一文中,我們研究了可能存在的最簡單的HTML網頁。這個網頁的形式如下:

這個可能存在的最簡單的CGI腳本在執行時,將會創建上述的簡單的靜態頁面作為其輸出。以下是用C語言編寫此CGI程式的形式:

在Web伺服器上,將此程式輸入到檔案simplest.c中,然後通過以下命令進行編譯:

將simplest.cgi放置在cgi-bin目錄中,它就可以執行了。您現在就可以通過鍵入或單擊此URL來嘗試一下:http://www.howstuffworks.com/cgi-bin/simplest.cgi。您可以看到,該腳本所做的全部工作就是生成顯示“Hello there!”的頁面。唯一沒有預料到的部分就是下面這行內容:

Content-type:text/htmlnn”這行內容是一段特殊的文本,任何CGI腳本必須首先將它傳送給瀏覽器。只要您記住這一點,就一切ok了。如果您忘記了這一點,則瀏覽器將拒絕輸出腳本。

您可以在PERL中執行相同的操作。將下面這段PERL代碼鍵入到一個名為simplest.pl的檔案中:

將該檔案放置到cgi-bin目錄中。在UNIX計算機上,鍵入以下內容也許會有用:

這將告知UNIX該腳本是可執行的。您現在就可以通過鍵入或單擊此URL來嘗試一下:http://www.howstuffworks.com/cgi-bin/simplest.pl。

您現在已經了解了CGI腳本的基本概念。相當簡單!實際上就是,執行一個程式,然後將程式的輸出傳送到調用腳本的瀏覽器。傳送給stdout的正常輸出就是傳送給瀏覽器的輸出。

不過,CGI腳本的重點在於創建動態內容——每次執行腳本時,輸出應該是不同。畢竟,如果每次運行腳本時的輸出都是相同的,您也可以使用靜態頁面。以下C語言程式演示了非常簡單的動態內容:

使用一個文本編輯器,將此程式鍵入到一個名為count.c的檔案中。通過鍵入以下命令對其進行編譯:

創建另一個名為count.txt的文本檔案,並在其中放入一個零。將counter.cgi和count.txt放置在cgi-bin目錄中,即可以運行腳本。您現在就可以通過鍵入或單擊此URL來嘗試一下:http://www.howstuffworks.com/cgi-bin/count.cgi。您可以看到,腳本所做的全部工作就是生成一個顯示“The current count is:X”的頁面。運行一次腳本,其中的X就會遞增一次。嘗試將腳本運行幾次,並注意觀察頁面內容的變化!

count.txt檔案保留當前計數,同時小的incrementcount()函式使count.txt檔案中的計數遞增。此函式將打開count.txt檔案、從中讀取數字、遞增數字並將其寫回到檔案中。實際上,此函式會嘗試打開檔案兩次。這樣做是為了防止兩個用戶試圖同時訪問該檔案。這項技術並非萬無一失,但對於這類簡單情況還是有效的。如果在第二次嘗試時無法打開檔案,則將為調用者返回錯誤值-1。更加完善的程式將識別返回值-1,並會生成相應的錯誤提示。

HTML表單

(圖)CGI腳本CGI腳本

我們已了解到CGI腳本的創建過程相當簡單。Web伺服器執行放置在cgi-bin目錄中的任何可執行程式,並且可執行程式傳送給 stdout的任何輸出都將出現在調用該腳本的瀏覽器中。現在,我們需要找到一種用於將輸入傳送到腳本的方法。傳送輸入的一般方法是使用HTML表單。
表單在網路上隨處可見。可以接受內容輸入的任何頁面都是表單。您可以在搜尋引擎、留言簿、問卷等上面看到這些表單。您在HTML頁上創建表單,並在表單的HTML標記中指定CGI腳本的名稱,當用戶單擊表單上的Submit按鈕時將調用該腳本。用戶輸入到表單中的值將會進行打包並傳送到CGI腳本,這樣腳本就可以隨意使用這些值。

實際上,上述情況是很常見的,只是您可能沒有意識到而已。例如,轉到 http://www.lycos.com,在“Search for:”框中鍵入“test”一詞並按“Go Get It!”按鈕。結果頁的 URL 類似於下面這樣:

您會發現Lycos主頁就是一個表單。Lycos在cgi-bin目錄中有一個名為pursuit的腳本。表單會向此腳本傳送五個參數:

matchmode=and
cat=lycos
query=test
x=10
y=9
第三個參數正是我們輸入的搜尋字元串。其他四個參數也為腳本提供了一些信息。CGI腳本在Lycos資料庫中查詢“test”一詞,然後返回結果。這就是任何搜尋引擎的核心!
讓我們創建一個簡單的表單進行試驗。創建一個名為simpleform.htm的檔案,然後在其中輸入以下 HTML:

可以單擊此URL進行試驗:http://www.howstuffworks.com/simpleform.htm。

您可以看到,HTML代碼指定創建一個使用GET方法的表單,並將該方法傳送給http://www.howstuffworks.com/cgi-bin/simpleform.cgi上的CGI腳本。該表單內包含一個文本輸入區域以及標準的“Submit”和“Reset”按鈕。

該表單引用的檔案http://www.howstuffworks.com/cgi-bin/simpleform.cgi是一個C程式。它開始是作為一段C代碼放置在名為simpleform.c的檔案中:

使用以下命令對這段代碼進行編譯:

然後,將其放置在cgi-bin目錄中。此程式只是收集表單傳送的值並顯示出來。例如,您可能會看到以下內容:

Name是表單中的文本輸入欄位的標識符(表單上的每個輸入欄位都應具有唯一的標識符),John+Smith是可能在表單上輸入的典型姓名。請注意,“+”將替換空白字元。

通過本示例,您可以看出設定表單並將表單中的數據傳送到CGI腳本中的基本過程是相當簡單的。有幾個細節需要注意:

表單上的每個輸入欄位應具有唯一的標識符。
表單需要使用GET或POST方法。使用GET方法的好處是,您可以在傳送給腳本的URL中查看錶單的值,從而使調試更簡單。
由於對可以通過GET方法傳送的字元數目存在一定的限制,因此對於大型表單,應優先使用POST方法。
使用GET方法傳送的數據可以通過查看QUERY_STRING環境變數(通常使用 C 語言程式中的getenv函式和PERL中的$ENV工具讀取)接收。使用POST方法傳送的數據可以通過stdin(使用C語言程式中的gets或PERL中的 ead)獲取。
傳送的數據會將所有欄位串接在一個字元串中,並將替換許多字元,因此需要進行轉換。例如,所有空白將替換為加號。
提到QUERY_STRING環境變數,有必要在此大致介紹一下環境變數。您可以在CGI 腳本中看到大量環境變數,其中包括:

AUTH_TYPE
CONTENT_LENGTH
CONTENT_TYPE
GATEWAY_INTERFACE
HTTP_ACCEPT
HTTP_USER_AGENT
PATH_INFO
PATH_TRANSLATED
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST
REMOTE_IDENT
REMOTE_USER
REQUEST_METHOD
SCRIPT_NAME
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
這些環境變數中隱藏了許多有用的信息,其中包括輸入字元串的長度 (CONTENT_LENGTH)、使用的METHOD(GET 或 POST -- REQUEST_METHOD可讓您清楚是在STDIN 中還是在QUERY_STRING中查找輸入)、用戶計算機的IP位址 (REMOTE_ADDR),等等。有關這些變數的完整說明,請參閱CGI環境變數。

The value entered was:Name=John+Smith gcc simpleform.c -o simpleform.cgi#include
#include

int main()
{
printf("Content-type:text/htmlnn");
printf("n");
printf("n");
printf("
The value entered was:") printf("%sn", getenv("QUERY_STRING")); printf("n"); printf("n"); return 0;} A super-simple form Enter Your Name:
http://www.lycos.com/cgi-bin/pursuit?matchmode=and andcat=lycosandquery=testandx=10andy=9

創建真實表單

(圖)CGI腳本CGI腳本

一個真實的表單將包含各種輸入區域,並需要在腳本中編寫一些代碼來撤消字元映射並分析出單個字元串。讓我們先看看錶單上的標準輸入控制項。這些控制項包括:
單行文本輸入
多行文本輸入
選擇列表
複選框
單選按鈕
專用按鈕 - 用於提交或清除表單
正如在任何其他網頁上一樣,你可以將這些控制項與其他靜態文本和圖形組合在一起。
以下的一些示例演示了如何使用不同的控制項標記:

單行編輯
“input”一詞標識單行編輯區域。“name”欄位為控制項提供了一個用於 CGI 腳本的標識符,此標識符對於表單上的每個控制項都應是唯一的。“size”欄位指示表單上的輸入區域的寬度(以字元為單位);“Maxlength”對輸入區域內的最大字元數進行限制。“value”設定初始值。

Enter Name:<input name=andquot;Nameandquot; size=30 maxlength=50
value=andquot;Sampleandquot;>
通常,輸入區域的前面是一段靜態文本,用於標識輸入欄位的用途。此處顯示的是靜態文本“Enter Name:”。

可以添加值“type=int”,以便將輸入限制為整數值。默認情況下,值的類型為“text”,可接受任何字元。

多行編輯
多行編輯區域與輸入區域類似。你可定義該控制項的名稱,並定義其在表單上的大小(以行和列為單位)。你在 標記之前輸入的任何內容都將作為默認值出現在控制項中。

<textarea name=andquot;Company Addressandquot; cols=30
rows=4></textarea>
複選框
複選框是類型設定為“checkbox”的特殊形式的輸入區域。

<input type=checkbox name=andquot;Includeandquot; value=1>
如果選中複選框,則將返回值。

單選按鈕
單選按鈕與複選框類似,但它們可以組合在一起呈現:

Choose the search area:<br>
<input type=radio CHECKED name=universe value=US-STOCK>
Stocks
<input type=radio name=universe value=CA-STOCK>
Canadian Stocks
<input type=radio name=universe value=MMF>
Money Markets
<input type=radio name=universe value=MUTUAL>
Mutual Funds
請注意,可以用 CHECKED 一詞來標記默認的單選按鈕。還請注意,同一組中的所有單選按鈕的名稱是相同的。

選擇列表
選擇列表使用戶可以在許多選項中進行選擇。選擇列表的標記可讓你在“size”欄位中指定可見行的數目,並可讓你指定所有選項的值。

Select an Option<br>
<SELECT size=2 NAME=andquot;Optionandquot;>
<OPTION> Option 1
<OPTION> Option 2
<OPTION> Option 3
<OPTION> Option 4
</SELECT>
MULTIPLE 一詞將創建多選功能。

專用按鈕
下列標記將創建兩個專用按鈕,一個按鈕用於向伺服器提交表單,另一個按鈕用於重置表單:

<INPUT TYPE=submit value=andquot;Submitandquot;>
<INPUT TYPE=reset value=andquot;Resetandquot;>

知識

(圖)CGI腳本CGI腳本

在這個關於CGI腳本的簡明教程中,我們已了解到:
CGI腳本是一個程式——通常為C語言程式或PERL腳本。

在大多數伺服器上,CGI腳本位於一個名為cgi-bin的目錄中。當瀏覽器請求腳本的URL時,將執行該腳本。

腳本傳送給STDOUT的任何內容都將被傳送給瀏覽器。首先傳送字元串“Content-type: text/htmlnn”。然後,再傳送其他內容;但是一般來說,將傳送有效HTML文檔的有效HTML標記。

通過創建HTML表單並使用其中的 ACTION指定腳本的URL,可將輸入內容傳送給腳本。

當腳本接收到表單中的數據後,需要分析出不同的字元串並轉換所有修改過的字元。我們演示了一個可以執行這些任務的簡單C語言程式。PERL的CGI庫使PERL腳本可以輕鬆轉換。
如果您在真實的網站上這樣做,那么通常會將每次調查的結果存儲在一個文本檔案或資料庫中,以便日後查看。利用C語言程式或PERL腳本很容易做到這一點。

相關搜尋

熱門詞條

聯絡我們