不錯的一篇學習CGI指令碼(指令碼)_基礎教程

來源:互聯網
上載者:User
學習CGI指令碼(指令碼)CGI 意思為 Common Gateway Interface, 一種基於瀏覽器的輸入、在Web伺服器上啟動並執行程式方法. CGI指令碼 使你的瀏覽器與使用者能互動,為了在資料庫中尋找一個名詞, 提供你寫入的評論,或者從一個表單中選擇幾個條目並且能得到一個明確的回答. 如果你曾經遇到過在web上填表或進行搜尋, 你就是用的CGI指令碼. 你那時也許沒有意識到,因為大部分工作是在伺服器上啟動並執行,你看到的只是結果.

作為一個網頁設計者, 你建立用戶端的 CGI指令碼, 伺服器端的程式用來處理使用者輸入, 結果返回給使用者.

在這裡你將學習關於CGI指令碼的一切:

  • CGI指令碼是什嗎?它是怎樣工作的
  • 一個CGI指令碼輸出象什嗎?
  • 怎樣用參數或無參數建立一個CGI指令碼
  • 怎樣建立一個返回規定響應的CGI指令碼
  • 怎樣建立一個輸入表單的CGI指令碼
  • 有關在使用CGI指令碼中的問題
  • 你能在指令碼中使用的CGI變數
本章節假設在UNIX系統下的。

CGI指令碼是什麼?

CGI指令碼簡單地講是個運行在Web伺服器上的程式, 有瀏覽器的輸入觸發. 這個指令碼通常象伺服器和系統中其他程式如資料庫的橋樑。

CGI 指令碼難道不是一個真正的指令碼?按照你的伺服器的支援, 他們可能是一個編譯好的程式或者批命令檔案或者其他可執行檔東西. 為了簡單起見,我們統稱他們為指令碼scripts.

CGI 指令碼是任何運行在web伺服器上的程式. CGI意思是Common Gateway Interface。  

CGI指令碼是用下列兩種方法使用的: 作為一個表單的ACTION 或 作為一個頁中的直接link。

CGI指令碼是怎樣工作的?

CGI指令碼有伺服器調用, 基於瀏覽器的資料輸入. 圖1 顯示在瀏覽器、伺服器和指令碼之間是怎樣的一個流程.

圖1. 從瀏覽器到伺服器到指令碼到程式 記住再回來噢!

這有個簡短的示意解釋:

  1. 一個URL指向一個CGI指令碼. 一個CGI指令碼的URL能如普通的URL一樣在任何地方出現。
  2. 伺服器接收請求, 按照那個URL指向的指令檔(注意檔案的位置和副檔名),執行指令碼.
  3. 指令碼執行基於輸入資料的操作,包括查詢資料庫、計算數值或調用系統中其他程式.
  4. 指令碼產生某種Web伺服器能理解的輸出結果.
  5. 伺服器接收來自指令碼的輸出並且把它傳回瀏覽器,讓使用者瞭解結果。
 

一個簡單的例子

這裡詳細一步一步地解釋所有有關發生的細節。
在圖2中有個例圖:
圖2. 帶有一個指令碼串連的頁.

Display Date處是個指向CGI指令碼的串連. 它的HTML是這樣的:

<A HREF="http://www.popchina.com/cgi-bin/getdate">Display the Date</A>
說明是個CGI指令碼是因為這裡面有個cgi-bin的路徑. 在許多伺服器cgi-bin是僅能夠放置CGI指令碼的目錄.

當你選擇這個串連時, 你的瀏覽器將向www.popchina.com伺服器提出請求. 伺服器接收這個請求計算出URL處的指令檔名然後執行這個指令碼.

這個getdate指令碼, 在UNIX系統中執行是這樣的:

#!/bin/shecho Content-type: text/plainecho/bin/date
第一行是個特殊的命令,告訴UNIX系統這是個shell指令碼; 真實的情況是從這行開始的下一行,這個指令碼做兩件事:它輸出行Content-type: text/plain, 接著開始一個空行;第二, 它調用UNIX系統時間date程式, 這樣輸出日期和時間. 指令碼執行後輸出應該這樣:
Content-type: text/plainTue Oct 25 16:15:57 EDT 1994
這個Content-type是什麼東東?它是個特殊的編碼,Web伺服器用來告訴瀏覽器輸出這個文本是什麼類型的. 這與HTML中Content-type含義是一樣的。

這樣瀏覽器的輸出就如圖3.

圖3 date指令碼輸出結果.

這是最基本的,實際情況要複雜得多,總之可以用來理解瀏覽器、伺服器和指令碼之間是怎樣工作的。

我能用CGI指令碼嗎?

在你使用CGI指令碼之前,有兩件事你也許要解決:CGI指令碼 是個進階的Web特性並且需要你和Web  伺服器管理者一樣好的知識。

肯定嗎?就是做不到,學學也可以?好吧!讓我們繼續.

你的伺服器配置允許CGI指令碼嗎?

為了能寫和運行CGI指令碼, 你需要一個Web伺服器. 不象通常的HTML檔案, 你不能在本地系統上寫或實驗你的CGI指令碼; 你得通過Web伺服器來做這個.

但是即使你有一個Web伺服器, 這個伺服器必須特別地為運行CGI指令碼配置一下. 那意味著你所有的指令碼必須放置在一個叫做cgi-bin的目錄下.

在編寫CGI指令碼之前, 詢問你的伺服器管理者是否允許你安裝和運行CGI指令碼, 並且如果可以的話,他們必須放置在哪兒?還有,你必須有個真正的Web伺服器,如果是FTP或Gopher伺服器,那你就不能用CGI.

如果你在自己的伺服器上運行, 你必須特別地創造一個叫cgi-bin的目錄,並配置你的伺服器認可這個目錄為一個指令碼目錄. 也必須記住下面有關CGI指令碼特點:

  • 每個指令碼是個程式, 它運行在瀏覽器可以請求的系統上, 執行時使用CPU時間和記憶體. 如果有成打上千的這些指令碼同時運行,會怎樣?你的系統將不忍負載直至崩潰。
  • 如果你不仔細地編寫你的CGI指令碼, 你將有可能讓別人通過你的CGI指令碼參數進入傷害你的系統.

你會編程嗎?

初學者注意! 一般地, 你必須具備一些基本編程概念與方法。你必須有類似系統工作的經驗。如果你沒有這些背景, 你必須去學習,好了,費話不多說.

你必須用什麼程式設計語言?

你可以用你熟悉的任何語言編寫CGI指令碼, 只要你的指令碼遵守下一節所陳列的規則即可,只要那個語言能在你的Web伺服器系統上運行.

在這本學習手冊中,僅用兩種語言編寫CGI指令碼: UNIX shell和 Perl語言. 這個shell是適合在任何相近的UNIX系統上運行並且容易學習, 但是處理複雜的情況就困難了. Perl, 就要用這個語言了, 它是免費的, 這個語言是穩定和強大的,類似C,但它也是較難學習的.

你的伺服器設定正確了嗎?

為了運行任何一個CGI指令碼, 不管簡單或複雜的,你的伺服器必須設定成能夠運行他們,必須放置在一個特定的目錄,必須有一個依賴你伺服器設定的副檔名.

如果你是租用伺服器,就要是否允許運行CGI指令碼.

如果你擁有自己的伺服器,檢查你的伺服器說明書是怎樣處理CGI指令碼的.

如果你用的不是UNIX?

只好再找別的學習手冊了。

解剖一個CGI指令碼

如果你編寫它很久,克服很多警告和配置,恭喜你,你已經會些CGI指令碼,並且可以在你的網頁上使用了. 在這一章,將學習指令碼是怎樣執行,你的伺服器又是怎樣與他們對話產生回應的。

輸出頭部

雖然你的CGI指令碼可以讓你做任何事情,但是指令碼的輸出還是必須有一個規定形式.
這個 "指令碼輸出" 意思是指你的指令碼發回伺服器的資料. 在UNIX系統中, 輸出是發向標準輸出, 伺服器從那兒檢測它. 在其他系統和伺服器, 你的指令碼輸出也許不一樣了.

這個頭部是實際不是文本的一部分,是伺服器與瀏覽器之間的資訊協議,你實際看不到。

有三個類型的頭部: Content-type, Location, 和Status. Content-type 最普遍的。

有關content-type解釋可以見有關HTML的說明, 一個你可以發出的特定編碼象這樣:

Content-type: text/html
在這個例子中,輸出資料的類型是text/html; 換句話說, 他是個HTML檔案.
    表1. 通用格式和content-types.
 
Format
Content-Type
HTML text/html
Text text/plain
GIF image/gif
JPEG image/jpeg
PostScript application/postscript
MPEG video/mpeg
注意content-type 後面必須跟一個空行. 如果你沒有空行,伺服器將無法搞清這個頭部在哪裡結束。

輸出資料

你輸出的資料應該符合你所規定的content-type; 如果content-type是text/html, 輸出安置應該是在HTML. 如果content-type是image/gif, 輸出應該是在一個二進位的GIF檔案.
練習1: 小試試.
T這是個簡單的輸出日期的簡單指令碼,這個CGI指令碼還檢查看看我是否已經登陸到我的Web伺服器,並且報告發現了什麼(如在圖4).

圖4. 指令碼的結果
這是個很簡單的例子, 他能這樣備調用:

<A HREF="http://www.popchina.com/cgi-bin/pinglaura">Is Laura Logged in?</A>
這是沒有輸入的指令碼,它只運行並且返回資料.

根據前面的闡述,這個指令碼內容是這樣::
#!/bin/sh
 

echo Content-type: text/html
 

echo "<HTML><HEAD>"
 

echo "<TITLE>Is Laura There?</TITLE>"
 

echo "</HEAD><BODY>"
為了測試我是否已經登陸系統,用who命令(我的登陸名假設為lemay), 儲存結果在變數ison中. 如果我登陸, 變數ison將有些內容,否則則是空的.

ison='who | grep lemay'
實驗結果及返回相應提示的指令碼是這樣:
if [ ! -z "$ison" ]; then        echo "<P>Laura is logged in."</P>else        echo "<P>Laura isn't logged in."</P>fi
最後關閉HTML:
echo "</BODY></HTML>"
現在你通過從命令列運行他,測試一下,你將得到一個結果說我未登陸你的系統,當然不可能的,他的輸出是這樣的:
Content-type: text/html<HTML><HEAD><TITLE>Are You There?</TITLE></HEAD><BODY><P>Laura is not logged in.</BODY></HTML>
這是輸出的一個HTML文本,這樣你的瀏覽器能正常顯示他,因為他是個HTML檔案。


 

現在將他copy到你的伺服器的cgi-bin目錄下,去執行,如果你不能達到CGI-bin目錄,你必須詢問你的伺服器管理者,你不能理所當然地自己建立個CGI-bin目錄,那沒用的。

這個例子完整的指令碼如下:

#!/bin/shecho "Content-type: text/html"echoecho "<HTML><HEAD>"echo "<TITLE>Is Laura There?</TITLE>"echo "</HEAD><BODY>"ison='who | grep lemay'if [ ! -z "$ison" ]; then        echo "<P>Laura is logged in"else        echo "<P>Laura isn't logged in"fiecho "</BODY></HTML>"

帶有參數的指令碼

為了傳遞一個參數給指令碼,可以在URL中使用 (?) 插入指令碼名詞和參數之間, 用加號(+) 表示每個單一的參數, 如:
<A HREF="/cgi-bin/myscript?arg1+arg2+arg3">run my script</A>
當伺服器接收到這個請求,它傳遞 arg1, arg2, 和 arg3 參數給指令碼. 你然後能在指令碼中使用這些參數.

這個方法有時叫查詢, 因為早期它用在搜尋功能中.

練習2: 檢查是否有人登陸.
既然你知道怎樣使用參數,讓我們繼續上面的例子pinglaura,通過修改這個例子我們得到下面這個指令碼pinggeneric.

我們取個不同題目:

#!/bin/shecho "Content-type: text/html"echoecho "<HTML><HEAD>"echo "<TITLE>Are You There?</TITLE>"echo "</HEAD><BODY>"
在上面的例子中, 下一步應該是測試我是否登陸,在這裡我們用參數${1}代替我的名字lemay,  ${1}作為第一個參數, ${2}作為第二個, ${3}作為第三個.
ison='who | grep "${1}"'

剩下的所有修改如下:

if [ ! -z "$ison" ]; then        echo "<P>$1 is logged in"else        echo "<P>$1 isn't logged in"fi
echo "</BODY></HTML>"
好了,讓我們修改HTML頁中的串連吧!原來是這樣:
<A HREF="http://www.lne.com/cgi-bin/pinglaura">Is Laura Logged in?</A>
修改為通用查詢功能後是這樣,比如查詢名字叫john的人是否登陸:
<A HREF="http://www.lne.com/cgi-bin/pinggeneric?john">Is John Logged in?</A>
在你的伺服器上試試,看是否有結果。

傳遞其他資訊給指令碼

有第二種方法傳遞資訊給CGI指令碼. 它叫作路徑資訊path information 用作那些在指令碼調用是不用變更的參數, 象一個臨時檔案名稱或呼叫指令碼自己的檔案名稱. 正如你看到的,在上面的例子問號後面的參數是因使用者表單的輸入而改變的. 路徑資訊Path info用作其他資訊傳遞給指令碼,實際上,你可以用它作任何事情.
路徑資訊Path information是一種不象通常參數指令碼那樣頻繁傳遞資訊的方法. 路徑Path information通常是指Web伺服器上的那些比如設定檔、臨時檔案或者被指令碼因問題調用的檔案等等此類檔案.  

看下面一個路徑資訊path information例子, :

http://myhost/cgi-bin/myscript/remaining_path_info?arg1+arg2
當指令碼運行時,在路徑中的資訊將被放置於環境參數PATH_INFO. 你能在你的指令碼內容中使用這些資訊.

比如說, 讓我們假設你在多頁上已有多個串連到同一個指令碼. 你能用這個路徑資訊顯示那個有串連的HTML檔案名稱. 這樣, 在你完成處理你的指令碼之後, 當你發回一個HTML檔案時, 你能在這個檔案裡包含一個串連,發回使用者一開始那個頁。

你會在下一章節學到更多重路徑資訊:有用的表單和指令碼. 待後來登出

建立一個特殊的指令碼輸出

現在你已經學習了諸如輸出資料 一般地HTML資料 發給瀏覽器解釋顯示的資料. 但是如果你不想把指令碼結果作為一個資料流形式發回瀏覽器,而是想把一個存在的頁發回,怎麼辦? 如果你只是要指令碼做一些事而不讓任何結果回答給瀏覽器,怎麼辦?

不用怕, 這裡開始解釋這些情況.

用調用另一個文本作為響應

CGI輸出不是非得一個資料流,有時可以告訴瀏覽器是存在伺服器上的一個頁,為了發出這個資訊,看下面的例子:
Location: ../docs/final.html
這個Location行用作通常的輸出位置,也就是說,如果你用了Location, 你就不必再用象Content-type這樣的資料輸出(實際上,你也不能). 正如Content-type, 你也必須在這一行後面跟一個空行.

指向這個檔案的路徑可以是一個URL或相對路徑. 所有相對路徑是指相對於指令碼所在的位置. 例子中的final.html文本是在當前上一個目錄下docs的目錄下:

echo Location: ../docs/final.htmlecho
你不能Content-type 和 Location兩個輸出同時使用. 比如, 如果你想輸出一個標準頁,但是想在這個頁尾加上客戶的內容, 你就得用Content-type自行組建這兩個部分. 注意:你可以用指令碼命令開啟一個當地檔案作為資料直接將之輸出.

No Response

有時對於一個CGI指令碼也許一點沒有輸出. 有時你只是要從使用者那兒收集點資訊. 你就不用再調用一個新文本, 也不用輸出結果或開啟一個存在的檔案. 在瀏覽器上的螢幕還是那個樣子.

很幸運, 這一切很容易. 你只要輸出下面這個命令即可(後面跟一個空行):

echo Status: 204 No Responseecho
這個Status頭部提供狀態代碼給伺服器(並且也給瀏覽器). 特別的204將傳遞給瀏覽器,如果能識別它,它將什麼也不做.


 

儘管無響應是一個官方HTTP規定的一部分,但也並不是適合所有的瀏覽器,也許會產生奇怪的結果,那你要多實驗試試看啦.

處理表單的指令碼

今天,大多數CGI指令碼是用來處理表單輸入的. 這個過程大致象上面說闡述的一樣,但還是有些不同,比如CGI指令碼只要被調用;資料怎樣從伺服器被發向瀏覽器.

記住, 大多數表單有兩個部分: HTML的表單格式;處理表單資料的CGI指令碼. 這個CGI指令碼使用標籤<FORM>屬性調用的.

表單形式和表單指令碼

正如上面所說,由於表單有兩個部分. 如下:

這個ACTION屬性包含著處理表單的指令碼:

<FORM ACTION="http://www.popchina.com/cgi-bin/processorscript">
在這個表單中, 每個輸入區都有一個NAME的屬性, 用來稱呼表單元素. 當這個表單資料被遞交給你在ACTION中定義的CGI指令碼, 這樣這些name和輸入內容被作為一個數字或字元傳遞給指令碼.

GET 和 POST

表單從瀏覽器發給伺服器有兩種方法.  GET 和 POST.

我們上面談論的方法,實際是GET,它將資料打包放置在環境變數QUERY_STRING中作為URL整體的一部分傳遞給伺服器。

POST做很多類似GET同樣的事情, 不同的地方就是它是分離地傳遞資料給指令碼. 你的指令碼通過標準輸入擷取這些資料. (有些Web伺服器是儲存在臨時檔案中.) 這個QUERY_STRING環境變數將不再設定.

那你用那個方法呢? POST是個安全的方法, 尤其如果你的表單中有很多資料的話. 當你用GET, 這個伺服器就分配變數QUERY_STRING給所有的表單資料, 但是這個變數可儲存量是有限的. 換句話說,如果你有很多資料但是你又用GET,你會丟失很多資料.

如果你用POST, 你可以儘可能多地使用資料, 因為這些資料從來也不分配到一個變數裡.

URL 編碼

URL 編碼是一種瀏覽器用來打包表單輸入的格式. 瀏覽器從表單中擷取所有的name和其中的值,將他們作為name/value參數編碼, 移去那些不能傳送的字元, 將資料排行等等,這些還取決於你用GET還是POST?作為URL的一部分或者分離地發給伺服器. 不管哪種情況, 在伺服器端的表單輸入格式樣子象這樣:
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
URL編碼遵循下列規則:
  • 每對name/value由&符分開.
  • 每對來自表單的name/value由=符分開. 如果使用者沒有輸入值給這個name,那麼這個name還是出現,只是無值(象這樣 "name=").
  • 任何特殊的字元(就是那些不是簡單的七位ASCII,如漢字) 將以百分符%用十六進位編碼. 當然也包括象 =, &, 和 % 這些特殊的字元.
  • 在輸入區中的空格將以加號+顯示.
因為表單輸入是用這個URL編碼傳遞給你的指令碼的,在你用這些參數之前必須解碼,因為解碼是個很普遍的工作,可以有很多工具做這個工作 . 你沒有必要自己寫這個解碼程式.

這裡介紹一個叫uncgi的解碼程式, 你可以從http://www.hyperion.com/~koreth/uncgi.html. 得到原碼,安裝在你自己的cgi-bin目錄下.

練習3: 告訴我你的名字.
讓我們以這個例子來說明,如圖5.

圖5. 告訴我你的名字的表單.

這個輸入被發給指令碼, 然後發回顯示一個hello的資訊(間圖.6).

如果你在姓名輸入處不輸入任何東東,會怎樣?見圖7.

圖6. 姓名表單的結果.

圖7. 另一個結果.

修改表單的HTML
現在我們舉一個真實的例子:
<FORM METHOD=POST ACTION="../cgi-bin/form-name"></FORM>
如果你在用uncgi從input中解碼, 情況有點不同. 為了是uncgi正常工作, 你首先必須調用uncgi , 如果uncgi是個目錄,加上實際的指令碼名, 象這樣:
<FORM METHOD=POST ACTION="../cgi-bin/uncgi/form-name"></FORM>
這樣,你不必修改表單中原始的HTML; 原始的HTML可以工作得很好.
指令碼
處理表單輸入的是個CGI指令碼, 讓我們來仔細地看看。

在指令碼中第一步是解碼,在這個例子中, 我們已經使用uncgi解碼輸入資料, 實際這個表單已經為你做好解碼. 通過建立一個uncgi的目錄,一旦表單遞交給伺服器,伺服器會自動進行解碼,這樣,所有的name/value已經準備就緒等待你的使用.

現在,一個例子開始部分假設是下面這樣:

echo Content-type: text/htmlechoecho "<HTML><HEAD>"echo "<TITLE>Hello</TITLE>"echo "</HEAD><BODY>"echo "<P>"
接下來,有兩種情況要處理:一件是處理使用者不輸入名字的情況,一個是如果輸入了向他們說hello.

這個Name元素的值, 是包含在WWW_theName環境變數中. 用一個簡單的測試命令(-z), 你能查看環境變數是否是空的還是包括相應的輸出值:

if [ ! -z "$WWW_theName" ]; then    echo "Hello, "    echo $WWW_theNameelse    echo "You don't have a name?"fi
最後增加一個串連"go back" . 用來返回:
echo "</P><P><A HREF="../lemay/name1.html">Go Back</A></P>"echo "</BODY></HTML>"
 

問題

這裡是使用CGI指令碼比較普遍的問題:
  • 指令碼內容只顯示不執行.

    你正確配置了你的伺服器運行CGI指令碼? 你的指令碼是放置在cgi-bin目錄中嗎?如果你的伺服器允許帶.cgi副檔名的CGI運行, 你的指令檔名的副檔名是這樣嗎?

  • Error 500: Server doesn't support POST.

    解答還是如上一條一樣,然後你用命令列執行你的CGI,可以正常運行嗎?是否有錯誤?.

  • Document contains no data.

    確定你的頭部行和資料部之間有一空行.

  • Error 500: Bad Script Request.

    確定你的指令碼是可執行檔(在UNIX, 用chmod +x 你的指令碼.cgi). 在從瀏覽器運行之前,你應當從命令列運行你的指令碼,如果用戶端是win95,可以用telnet登陸你的伺服器,執行命令列,當然必須瞭解UNIX命令.

CGI變數

表2 總結那些環境變數.
    表2. CGI 環境變數.
 
環境變數         
意義
SERVER_NAME CGI指令碼運行時的主機名稱和IP地址.
SERVER_SOFTWARE 你的伺服器的類型如: CERN/3.0 或 NCSA/1.3.
GATEWAY_INTERFACE 啟動並執行CGI版本. 對於UNIX伺服器, 這是CGI/1.1.
SERVER_PROTOCOL 伺服器啟動並執行HTTP協議. 這裡當是HTTP/1.0.
SERVER_PORT 伺服器啟動並執行TCP口,通常Web伺服器是80.
REQUEST_METHOD POST 或 GET, 取決於你的表單是怎樣遞交的.
HTTP_ACCEPT  瀏覽器能直接接收的Content-types, 可以有HTTP Accept header定義.
HTTP_USER_AGENT 遞交表單的瀏覽器的名稱、版本 和其他平台性的附加資訊。
HTTP_REFERER 遞交表單的文本的 URL,不是所有的瀏覽器都發出這個資訊,不要依賴它
PATH_INFO 附加的路徑資訊, 由瀏覽器通過GET方法發出.
PATH_TRANSLATED 在PATH_INFO中系統規定的路徑資訊.
SCRIPT_NAME 指向這個CGI指令碼的路徑, 是在URL中顯示的(如, /cgi-bin/thescript).
QUERY_STRING 指令碼參數或者表單輸入項(如果是用GET遞交). QUERY_STRING 包含URL中問號後面的參數.
REMOTE_HOST 遞交指令碼的主機名稱,這個值不能被設定.
REMOTE_ADDR 遞交指令碼的主機IP地址.
REMOTE_USER 遞交指令碼的使用者名稱. 如果伺服器的authentication被啟用,這個值可以設定。
REMOTE_IDENT 如果Web伺服器是在ident (一種確認使用者串連你的協議)運行, 遞交表單的系統也在運行ident, 這個變數就含有ident傳回值.
CONTENT_TYPE 如果表單是用POST遞交, 這個值將是 application/x-www-form-urlencoded. 在上傳檔案的表單中, content-type 是個 multipart/form-data.
CONTENT_LENGTH 對於用POST遞交的表單, 標準輸入口的位元組數.

表單輸入的解碼程式

目前有兩個程式: 通用目的的uncgi, 和cgi-lib.pl, 這是個Perl庫,用於perl編寫的CGI指令碼.

當然也有表單上傳時可以解碼的程式,很少。

uncgi

說明原碼可以從 http://www.hyperion.com/~koreth/uncgi.html獲得。

cgi-lib.pl

這是由Steve Brenner編寫的, 協助你管理輸入. 他能從GET和POST擷取輸入並且放置在一個Perl列表或陣列中. 更新的版本也能處理來自表單的檔案上傳. 從這兒可以得到資訊與原碼 http://www.bio.cam.ac.uk/cgi-lib. 如果你決定用Perl語言處理你的表單輸入,cgi-lib是個很好的庫.

為了使用cgi-lib.pl,你通常要這樣寫:
#!/usr/lib/perl

require 'cgi-lib.pl';
cgi-lib中儘管有很多子程式, 最重要的是ReadParse子程. ReadParse 讀取輸入方便地將name/value儲存在一個Perl陣列中. 在你的Perl指令碼中通常是這樣調用的:
&ReadParse(*in);
此例中,陣列名是in, 可以隨便取名的.

在表單輸入解碼後, 你能讀取和處理這個name/value,方法是象下面這樣:

print $in{'theName'};
這個將顯示名字name是theName的值value.

如果你有多個用同樣名字的name對, cgi-lib.pl用(\0)分隔多個名字. 這樣可以正常處理你的指令碼.

解碼上傳的檔案輸入

基於表單的檔案上傳需要不同的表單輸入,有一些程式可以對其進行解碼。

cgi-lib.pl 後來版本可以很好支援, 在http://www.bio.cam.ac.uk/cgi-lib/ 瞭解更多的情況.

另一個處理用Perl編寫的CGI地址是 http://valine.ncsa.uiuc.edu/cgi_docs.html .

自己做

找專門書籍學習吧: ftp://ds.internic.net/rfc/rfc1867.txt.

非解剖的指令碼頭部

按照本書闡述,大多數情況可以正常操作,在一些情況下不是這樣的,你可以翻閱說明書瞭解。

<ISINDEX> 指令碼

為了在CGI中完成討論群組, 我們看看叫<ISINDEX>的搜尋. 這是早期在瀏覽器中用來向伺服器發出搜尋索引鍵的辦法,參看以前的資料。

總結

CGI指令碼, 有時叫伺服器端指令碼或閘道指令碼。 在internet上有很多免費資源,你可以搜尋下載讀懂他們,當然都是英文的,如果你下決心翻譯他們(可能更加強理解). 這樣一舉兩得啊.

注意:上述程式可以用ultra edit來編輯,注意轉換UNIX格式 ,必須採用UNIX格式存檔,再上傳,用telnet登陸,在命令列鍵入perl sample.pl,看有無bug,再 在瀏覽器中調用。CGI程式包括放置CGI的目錄一定要改屬性為777, 要寫入的HTML檔案也要改屬性為777.

現在網上有很多免費的cgi,基本可以滿足一般需求,請到這個網址查詢你要的cgi:http://www.itm.com/cgicollection/

本人漢化了一個古老的通用留言簿,大家可以拿去做自己的留言簿。這裡下載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.