https://blog.csdn.net/chinaclock/article/details/50209897
CGI 意思為 Common Gateway Interface, 一種基于瀏覽器的輸入、在Web服務(wù)器上運行的程序方法. CGI腳本 使你的瀏覽器與用戶(hù)能交互,為了在數據庫中尋找一個(gè)名詞, 提供你寫(xiě)入的評論,或者從一個(gè)表單中選擇幾個(gè)條目并且能得到一個(gè)明確的回答. 如果你曾經(jīng)遇到過(guò)在web上填表或進(jìn)行搜索, 你就是用的CGI腳本. 你那時(shí)也許沒(méi)有意識到,因為大部分工作是在服務(wù)器上運行的,你看到的只是結果.
作為一個(gè)網(wǎng)頁(yè)設計者, 你創(chuàng )建客戶(hù)端的 CGI腳本, 服務(wù)器端的程序用來(lái)處理用戶(hù)輸入, 結果返回給用戶(hù).
在這里你將學(xué)習關(guān)于CGI腳本的一切:
CGI腳本是什么?它是怎樣工作的
一個(gè)CGI腳本輸出象什么?
怎樣用參數或無(wú)參數創(chuàng )建一個(gè)CGI腳本
怎樣創(chuàng )建一個(gè)返回規定響應的CGI腳本
怎樣創(chuàng )建一個(gè)輸入表單的CGI腳本
有關(guān)在使用CGI腳本中的問(wèn)題
你能在腳本中使用的CGI變量
目 錄
CGI腳本是什么?CGI腳本 怎樣工作的?一個(gè)簡(jiǎn)單的例子我能用CGI腳本嗎?你的服務(wù)器配置允許CGI腳本嗎?你能編程嗎?你應該用什么編程語(yǔ)言?你的服務(wù)器設置正確嗎?如果你的服務(wù)器不是UNIX系統呢?解剖CGI腳本輸出頭部輸出數據部帶闡述的腳本傳遞其他信息給腳本創(chuàng )建特殊的腳本輸出以裝載另一個(gè)文本響應無(wú)響應處理表單的腳本表單格式和表單腳本GET 和 POSTURL 編碼問(wèn)題CGI 變量解碼程序uncgicgi-lib.pl解碼文件上傳的輸入自己做非解剖的頭部腳本總結CGI腳本是什么?
CGI腳本簡(jiǎn)單地講是個(gè)運行在Web服務(wù)器上的程序, 有瀏覽器的輸入觸發(fā). 這個(gè)腳本通常象服務(wù)器和系統中其他程序如數據庫的橋梁?! GI 腳本難道不是一個(gè)真正的腳本?按照你的服務(wù)器的支持, 他們可能是一個(gè)編譯好的程序或者批命令文件或者其他可執行的東西. 為了簡(jiǎn)單起見(jiàn),我們統稱(chēng)他們?yōu)槟_本scripts.
CGI 腳本是任何運行在web服務(wù)器上的程序. CGI意思是Common Gateway Interface。
CGI腳本是用下列兩種方法使用的: 作為一個(gè)表單的ACTION 或 作為一個(gè)頁(yè)中的直接link。
CGI腳本是怎樣工作的?
CGI腳本由服務(wù)器調用, 基于瀏覽器的數據輸入. 其工作原理如下:一個(gè)URL指向一個(gè)CGI腳本. 一個(gè)CGI腳本的URL能如普通的URL一樣出現,區別于.htm/.html靜態(tài)UR,CGI的URL是動(dòng)態(tài)URL。如http://xxxx.com/cgiurl
服務(wù)器CGI接收瀏覽器的請求, 按照那個(gè)URL指向對應的腳本文件(注意文件的位置和擴展名),執行CGI腳本.
CGI腳本執行基于輸入數據的操作,包括查詢(xún)數據庫、計算數值或調用系統中其他程序.
CGI腳本產(chǎn)生某種Web服務(wù)器能理解的輸出結果.
服務(wù)器接收來(lái)自腳本的輸出并且把它傳回瀏覽器,讓用戶(hù)了解處理結果。
一個(gè)簡(jiǎn)單的例子
這里詳細一步一步地解釋所有有關(guān)發(fā)生的細節。
假設有一個(gè)Html頁(yè)面有一個(gè)指向CGI腳本的鏈接:<A >Display the Date</A> 這個(gè)鏈接指向的是一個(gè)CGI腳本,因為其中有cgi-bin的路徑. 在許多服務(wù)器cgi-bin是僅能夠放置CGI腳本 的目錄?! ‘斈氵x擇這個(gè)鏈接時(shí), 你的瀏覽器將向www.jdon.com服務(wù)器提出請求. 服務(wù)器接收這個(gè)請求計算出URL處的腳本文件名然后執行g(shù)etdate這個(gè)腳本.
這個(gè)getdate腳本, 在UNIX系統中執行是這樣的:
#!/bin/shecho Content-type: text/plainecho/bin/date 第一行是個(gè)特殊的命令,告訴UNIX系統這是個(gè)shell腳本; 真正邏輯是從這行開(kāi)始的下一行,這個(gè)腳本做兩件事:它輸出行Content-type: text/plain, 接著(zhù)開(kāi)始一個(gè)空行;第二, 它調用UNIX系統時(shí)間date程序, 這樣輸出日期和時(shí)間. 腳本執行后輸出應該這樣:Content-type: text/plainTue Oct 25 16:15:57 EDT 1994 這個(gè)Content-type是什么東東?它是個(gè)特殊的編碼,Web服務(wù)器用來(lái)告訴瀏覽器輸出這個(gè)文本是什么類(lèi)型的. 這與HTML中Content-type含義是一樣的?! ∵@是最基本的,實(shí)際情況要復雜得多,總之可以用來(lái)理解瀏覽器、服務(wù)器和腳本之間是怎樣工作的。
我能用CGI腳本嗎?
在你使用CGI腳本之前,有兩件事你也許要解決:CGI腳本 是個(gè)高級的Web特性并且需要你擁有與Web 服務(wù)器管理者一樣棒的知識?! 】隙▎??就是做不到,學(xué)學(xué)也可以?好吧!讓我們繼續.
你的服務(wù)器配置允許CGI腳本嗎?
為了能編寫(xiě)和運行CGI腳本, 你需要一個(gè)Web服務(wù)器. 不象通常靜態(tài)的HTML文件, 你不能在本地系統上編寫(xiě)或試驗你的CGI腳本; 你得通過(guò)Web服務(wù)器來(lái)做這個(gè). 但是即使你有一個(gè)Web服務(wù)器, 這個(gè)服務(wù)器必須特別地為運行CGI腳本配置一下. 那意味著(zhù)你所有的腳本必須放置在一個(gè)叫做cgi-bin的目錄下.
在編寫(xiě)CGI腳本之前, 需要詢(xún)問(wèn)你的服務(wù)器管理者是否允許你安裝和運行CGI腳本, 并且如果可以的話(huà),他們必須放置在哪兒?還有,你必須有個(gè)真正的Web服務(wù)器,如果是FTP或Gopher服務(wù)器,那你就不能用CGI.
如果你在自己的服務(wù)器上運行, 你必須特別地創(chuàng )造一個(gè)叫cgi-bin的目錄,并配置你的服務(wù)器認可這個(gè)目錄為一個(gè)腳本目錄. 也必須記住下面有關(guān)CGI腳本特點(diǎn):
每個(gè)腳本是個(gè)程序, 它運行在瀏覽器可以請求的系統上, 執行時(shí)使用CPU時(shí)間和內存. 如果有成打上千的這些腳本同時(shí)運行,會(huì )怎樣?你的系統將不忍負載直至崩潰。
如果你不仔細地編寫(xiě)你的CGI腳本, 你將有可能讓別人通過(guò)你的CGI腳本參數進(jìn)入傷害你的系統.
你會(huì )編程嗎?
初學(xué)者注意! 一般地, 你必須具備一些基本編程概念與方法。你必須有類(lèi)似系統工作的經(jīng)驗。如果你沒(méi)有這些背景, 你必須去學(xué)習,好了,費話(huà)不多說(shuō).
你必須用什么編程語(yǔ)言?
你可以用你熟悉的任何語(yǔ)言編寫(xiě)CGI腳本, 只要你的腳本遵守下一節所陳列的規則即可,只要那個(gè)語(yǔ)言能在你的Web服務(wù)器系統上運行. 在這本學(xué)習手冊中,僅用兩種語(yǔ)言編寫(xiě)CGI腳本: UNIX shell和 Perl語(yǔ)言. 這個(gè)shell是適合在任何相近的UNIX系統上運行并且容易學(xué)習, 但是處理復雜的情況就困難了. Perl是免費的, 這個(gè)語(yǔ)言特點(diǎn)是穩定和強大的,類(lèi)似C,但它也是較難學(xué)習的.
你的服務(wù)器設置正確了嗎?
為了運行任何一個(gè)CGI腳本, 不管簡(jiǎn)單或復雜的,你的服務(wù)器必須設置成能夠運行他們,必須放置在一個(gè)特定的目錄,必須有一個(gè)依賴(lài)你服務(wù)器設定的文件擴展名. 如果你是租用服務(wù)器,就要是否允許運行CGI腳本.
如果你擁有自己的服務(wù)器,檢查你的服務(wù)器說(shuō)明書(shū)是怎樣處理CGI腳本的.
如果你用的不是UNIX?
只好再找別的學(xué)習手冊了。
解剖一個(gè)CGI腳本
如果你編寫(xiě)它很久,克服很多警告和配置,恭喜你,你已經(jīng)會(huì )些CGI腳本,并且可以在你的網(wǎng)頁(yè)使用了. 在這一章,將學(xué)習腳本是怎樣執行,你的服務(wù)器又是怎樣與他們對話(huà)產(chǎn)生回應的。
輸出頭部
雖然你的CGI腳本可以讓你做任何事情,但是腳本的輸出還是必須有一個(gè)規定形式.
這個(gè) "腳本輸出" 意思是指你的腳本發(fā)回服務(wù)器的數據. 在UNIX系統中, 輸出是發(fā)向標準輸出, 服務(wù)器從那兒檢測它. 在其他系統和服務(wù)器, 你的腳本輸出也許不一樣了.
首先,輸出頭部信息,頭部是實(shí)際不是文本的一部分,是服務(wù)器與瀏覽器之間的信息協(xié)議,你實(shí)際看不到。 有三個(gè)類(lèi)型的頭部: Content-type, Location, 和Status. Content-type 是最普遍的。
有關(guān)content-type解釋可以見(jiàn)有關(guān)HTML的說(shuō)明, 發(fā)出text/html特定編碼如下:
Content-type: text/html 在這個(gè)例子中,輸出數據的類(lèi)型是text/html; 換句話(huà)說(shuō), 輸出的是個(gè)HTML文件.表1. 通用格式和content-types.
FormatContent-Type
HTMLtext/html
Texttext/plain
GIFimage/gif
JPEGimage/jpeg
PostScriptapplication/postscript
MPEGvideo/mpeg
注意content-type 后面必須跟一個(gè)空行. 如果你沒(méi)有空行,服務(wù)器將無(wú)法搞清這個(gè)頭部在哪里結束。
輸出數據
你輸出的數據應該符合你所規定的content-type; 如果content-type是text/html, 輸出安置應該是在HTML. 如果content-type是image/gif, 輸出應該是在一個(gè)二進(jìn)制的GIF文件.
練習1: 小試試.
這是個(gè)簡(jiǎn)單的輸出日期的簡(jiǎn)單腳本,這個(gè)CGI腳本還檢查看看是否已經(jīng)登陸到Web服務(wù)器,并且報告發(fā)現了什么?! ≌{用代碼這樣:
<A >Is Laura Logged in?</A> 這是沒(méi)有輸入的腳本,它只運行并且返回數據. pinglaura腳本內容是這樣::
#!/bin/sh
echo Content-type: text/html
echo "<HTML><HEAD>"
echo "<TITLE>Is Laura There?</TITLE>"
echo "</HEAD><BODY>"
為了測試是否已經(jīng)登陸系統,用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 最后關(guān)閉HTML: echo "</BODY></HTML>" 現在你通過(guò)從命令行運行這個(gè)腳本,測試一下,你將得到一個(gè)結果說(shuō)XXX未登陸你的系統,輸出是這樣的:Content-type: text/html<HTML><HEAD><TITLE>Are You There?</TITLE></HEAD><BODY><P>Laura is not logged in.</BODY></HTML> 這是輸出的一個(gè)HTML文本,這樣你的瀏覽器能正常顯示這內容,因為它是個(gè)HTML文件。
現在將它c(diǎn)opy到你的服務(wù)器的cgi-bin目錄下,就可以從瀏覽器調用執行了,如果你不能訪(fǎng)問(wèn)cgi-bin目錄,你必須詢(xún)問(wèn)你的服務(wù)器管理者,你不能理所當然地自己建立個(gè)cgi-bin目錄,那沒(méi)用的。
這個(gè)例子完整的腳本如下:
#!/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>"帶有參數的腳本
為了傳遞一個(gè)參數給腳本,可以在URL中使用 (?) 插入腳本名詞和參數之間, 用加號(+) 表示每個(gè)單一的參數, 如:<A HREF="/cgi-bin/myscript?arg1+arg2+arg3">run my script</A> 當服務(wù)器接收到這個(gè)請求,它傳遞 arg1, arg2, 和 arg3 參數給腳本. 你然后能在腳本中使用這些參數. 這個(gè)方法有時(shí)叫查詢(xún), 因為早期它用在搜索功能中.
練習2: 檢查是否有人登陸.
既然你知道怎樣使用參數,讓我們繼續上面的例子pinglaura,通過(guò)修改這個(gè)例子我們得到下面這個(gè)腳本pinggeneric. 我們取個(gè)不同標題:
#!/bin/shecho "Content-type: text/html"echoecho "<HTML><HEAD>"echo "<TITLE>Are You There?</TITLE>"echo "</HEAD><BODY>" 在上面的例子中, 下一步應該是測試我是否登陸,在這里我們用參數${1}代替我的名字lemay, ${1}作為第一個(gè)參數, ${2}作為第二個(gè), ${3}作為第三個(gè).ison='who | grep "${1}"' 剩下的所有修改如下:
if [ ! -z "$ison" ]; then echo "<P>$1 is logged in"else echo "<P>$1 isn't logged in"fiecho "</BODY></HTML>" 好了,讓我們修改HTML頁(yè)中的連接吧!原來(lái)是這樣:<A >Is Laura Logged in?</A> 修改為通用查詢(xún)功能后是這樣,比如查詢(xún)名字叫john的人是否登陸:<A >Is John Logged in?</A> 在你的服務(wù)器上試試,看是否有結果。
傳遞其他信息給腳本
除了上面介紹的方法傳遞數據給腳本以外,還有第二種方法傳遞信息給CGI腳本. 它叫作路徑信息path information, 在上面例子的問(wèn)號后面的參數是因用戶(hù)表單的輸入而改變的. 路徑信息Path info用作其他信息傳遞給腳本,實(shí)際上,你可以用它作任何事情.
路徑信息Path information是一種不象通常參數腳本那樣頻繁傳遞信息的方法. 路徑Path information通常是指Web服務(wù)器上的那些比如配置文件、臨時(shí)文件或者被腳本因問(wèn)題調用的文件等等此類(lèi)文件.
看下面一個(gè)路徑信息path information例子, :
http://myhost/cgi-bin/myscript/remaining_path_info?arg1+arg2 當腳本運行時(shí),在路徑中的信息"myscript"將被放置于環(huán)境參數PATH_INFO. 你能在你的腳本內容中使用這些信息. 比如說(shuō), 讓我們假設你在多頁(yè)上已有多個(gè)連接到同一個(gè)腳本. 你能用這個(gè)路徑信息顯示那個(gè)有鏈接的HTML文件名, 這樣, 在你完成處理你的腳本之后, 當你發(fā)回一個(gè)HTML文件時(shí), 你能在這個(gè)文件里包含一個(gè)鏈接,發(fā)回給用戶(hù)其剛開(kāi)始訪(fǎng)問(wèn)的那個(gè)起始頁(yè)。
你會(huì )在下一章節學(xué)到更多路徑信息:有用的表單和腳本.
創(chuàng )建一個(gè)特殊的腳本輸出
現在你已經(jīng)學(xué)習了諸如輸出數據 如HTML數據 發(fā)給瀏覽器解釋顯示的數據. 但是如果你不想把腳本結果作為一個(gè)數據流形式發(fā)回瀏覽器,而是想把一個(gè)存在的頁(yè)發(fā)回,怎么辦? 如果你只是要腳本做一些事而不讓任何結果回答給瀏覽器,怎么辦? 不用擔心, 這里開(kāi)始解釋這些情況.
用調用另一個(gè)文本作為響應
CGI輸出不是非得一個(gè)數據流,有時(shí)可以響應告訴瀏覽器的是在服務(wù)器上的一個(gè)頁(yè)面文件,為了發(fā)出這個(gè)信息,看下面的例子:Location: ../docs/final.html 這個(gè)Location行用作通常的輸出文件定位,也就是說(shuō),如果你用了Location, 你就不必再用象Content-type這樣的數據輸出(實(shí)際上,你也不能). 正如Content-type, 你也必須在這一行后面跟一個(gè)空行. 指向這個(gè)文件的路徑可以是一個(gè)URL或相對路徑. 所有相對路徑是指相對于腳本所在的位置. 例子中的final.html文本是在當前上一個(gè)目錄下docs的目錄下:
echo Location: ../docs/final.htmlecho 你不能同時(shí)使用Content-type 和 Location兩個(gè)輸出. 比如, 如果你想輸出一個(gè)標準頁(yè),但是想在這個(gè)頁(yè)尾加上客戶(hù)的內容, 你就得用Content-type自行組建這兩個(gè)部分. 注意:你可以用腳本命令打開(kāi)一個(gè)當地文件作為數據直接將之輸出.
No Response
有時(shí)對于一個(gè)CGI腳本也許一點(diǎn)沒(méi)有輸出. 有時(shí)你只是要從用戶(hù)那兒收集點(diǎn)信息. 你就不用再調用一個(gè)新文本, 也不用輸出結果或打開(kāi)一個(gè)存在的文件. 在瀏覽器上的屏幕還是那個(gè)樣子. 很幸運, 這一切很容易. 你只要輸出下面這個(gè)命令即可(后面跟一個(gè)空行):
echo Status: 204 No Responseecho 這個(gè)Status頭部提供狀態(tài)碼給服務(wù)器(并且也給瀏覽器). 特別的204將傳遞給瀏覽器,如果能識別它,它將什么也不做.
盡管無(wú)響應是一個(gè)官方HTTP規定的一部分,但也并不是適合所有的瀏覽器,也許會(huì )產(chǎn)生奇怪的結果,那你要多試驗試試看啦.
處理表單的腳本
今天,大多數CGI腳本是用來(lái)處理表單輸入的. 這個(gè)過(guò)程大致象上面說(shuō)闡述的一樣,但還是有些不同,比如CGI腳本只要被調用;數據怎樣從服務(wù)器被發(fā)向瀏覽器. 記住, 大多數表單有兩個(gè)部分: HTML的表單格式;處理表單數據的CGI腳本。 這個(gè)CGI腳本是使用Html標簽<FORM action=..>屬性調用的.
表單形式和表單腳本
正如上面所說(shuō),由于表單有兩個(gè)部分. Action屬性包含著(zhù)處理表單的腳本:<FORM ACTION="http://www.popchina.com/cgi-bin/processorscript"> 在這個(gè)表單中, 每個(gè)輸入區都有一個(gè)NAME的屬性, 用來(lái)稱(chēng)呼表單元素. 當這個(gè)表單數據被遞交,你在A(yíng)CTION中定義的CGI腳本, 這樣這些name和輸入內容被作為一個(gè)數字或字符傳遞給腳本.
GET 和 POST
表單從瀏覽器發(fā)給服務(wù)器有兩種方法. GET 和 POST. 我們上面談?wù)摰姆椒?,?shí)際是GET,它將數據打包放置在環(huán)境變量QUERY_STRING中作為URL整體的一部分傳遞給服務(wù)器。
POST做很多類(lèi)似GET同樣的事情, 不同的地方就是它是分離地傳遞數據給腳本. 你的腳本通過(guò)標準輸入獲取這些數據. (有些Web服務(wù)器是存儲在臨時(shí)文件中.) 這個(gè)QUERY_STRING環(huán)境變量將不再設置.
那你用那個(gè)方法呢? POST是個(gè)安全的方法, 尤其如果你的表單中有很多數據的話(huà). 當你用GET, 這個(gè)服務(wù)器就分配變量QUERY_STRING給所有的表單數據, 但是這個(gè)變量可存儲量是有限的. 換句話(huà)說(shuō),如果你有很多數據但是你又用GET,你會(huì )丟失很多數據.
如果你用POST, 你可以盡可能多地使用數據, 因為這些數據從來(lái)也不分配到一個(gè)變量里.
URL 編碼
URL 編碼是一種瀏覽器用來(lái)打包表單輸入的格式. 瀏覽器從表單中獲取所有的name和其中的值 ,將他們作為name/value參數編碼, 移去那些不能傳送的字符, 將數據排行等等,這些還取決于你用GET還是POST?是作為URL的一部分或者分離地發(fā)給服務(wù)器? 不管哪種情況, 在服務(wù)器端的表單輸入格式樣子象這樣:theName=Ichabod+Crane&gender=male&status=missing&headless=yes URL編碼遵循下列規則:每對name/value由&符分開(kāi).
每對來(lái)自表單的name/value由=符分開(kāi). 如果用戶(hù)沒(méi)有輸入值給這個(gè)name,那么這個(gè)name還是出現,只是無(wú)值(象這樣 "name=").
任何特殊的字符(就是那些不是簡(jiǎn)單的七位ASCII,如漢字) 將以百分符%用十六進(jìn)制編碼. 當然也包括象 =, &, 和 % 這些特殊的字符.
在輸入區中的空格將以加號+顯示.
因為表單輸入是用這個(gè)URL編碼傳遞給你的腳本的,在你用這些參數之前必須解碼,因為解碼是個(gè)很普遍的工作,可以有很多工具做這個(gè)工作 . 你沒(méi)有必要自己寫(xiě)這個(gè)解碼程序. 這里介紹一個(gè)叫uncgi的解碼程序, 你可以從
http://www.hyperion.com/~koreth/uncgi.html. 得到原碼,安裝在你自己的cgi-bin目錄下.
CGI變量
表2 總結了環(huán)境變量. 如下環(huán)境變量 意義
SERVER_NAMECGI腳本運行時(shí)的主機名和IP地址.
SERVER_SOFTWARE你的服務(wù)器的類(lèi)型如: CERN/3.0 或 NCSA/1.3.
GATEWAY_INTERFACE運行的CGI版本. 對于UNIX服務(wù)器, 這是CGI/1.1.
SERVER_PROTOCOL服務(wù)器運行的HTTP協(xié)議. 這里當是HTTP/1.0.
SERVER_PORT服務(wù)器運行的TCP口,通常Web服務(wù)器是80.
REQUEST_METHODPOST 或 GET, 取決于你的表單是怎樣遞交的.
HTTP_ACCEPT 瀏覽器能直接接收的Content-types, 可以有HTTP Accept header定義.
HTTP_USER_AGENT遞交表單的瀏覽器的名稱(chēng)、版本 和其他平臺性的附加信息。
HTTP_REFERER遞交表單的文本的 URL,不是所有的瀏覽器都發(fā)出這個(gè)信息,不要依賴(lài)它
PATH_INFO附加的路徑信息, 由瀏覽器通過(guò)GET方法發(fā)出.
PATH_TRANSLATED在PATH_INFO中系統規定的路徑信息.
SCRIPT_NAME指向這個(gè)CGI腳本的路徑, 是在URL中顯示的(如, /cgi-bin/thescript).
QUERY_STRING腳本參數或者表單輸入項(如果是用GET遞交). QUERY_STRING 包含URL中問(wèn)號后面的參數.
REMOTE_HOST遞交腳本的主機名,這個(gè)值不能被設置.
REMOTE_ADDR遞交腳本的主機IP地址.
REMOTE_USER遞交腳本的用戶(hù)名. 如果服務(wù)器的authentication被激活,這個(gè)值可以設置。
REMOTE_IDENT如果Web服務(wù)器是在ident (一種確認用戶(hù)連接你的協(xié)議)運行, 遞交表單的系統也在運行ident, 這個(gè)變量就含有ident返回值.
CONTENT_TYPE如果表單是用POST遞交, 這個(gè)值將是 application/x-www-form-urlencoded. 在上載文件的表單中, content-type 是個(gè) multipart/form-data.
CONTENT_LENGTH對于用POST遞交的表單, 標準輸入口的字節數.
表單輸入的解碼程序
目前有兩個(gè)程序: 通用目的的uncgi, 和cgi-lib.pl, 這是個(gè)Perl庫,用于perl編寫(xiě)的CGI腳本.當然也有表單上載時(shí)可以解碼的程序,不過(guò)很少。
uncgi
說(shuō)明原碼可以從
http://www.hyperion.com/~koreth/uncgi.html獲得。
cgi-lib.pl
這是由Steve Brenner編寫(xiě)的, 幫助你管理輸入. 他能從GET和POST獲取輸入并且放置在一個(gè)Perl列表或陣列中. 更新的版本也能處理來(lái)自表單的文件上傳. 從這兒可以得到信息與原碼
http://www.bio.cam.ac.uk/cgi-lib. 如果你決定用Perl語(yǔ)言處理你的表單輸入,cgi-lib是個(gè)很好的庫. 為了使用cgi-lib.pl,你通常要這樣寫(xiě):
#!/usr/lib/perl
require 'cgi-lib.pl'; cgi-lib中盡管有很多子程序, 最重要的是ReadParse子程. ReadParse 讀取輸入方便地將name/value儲存在一個(gè)Perl陣列中. 在你的Perl腳本中通常是這樣調用的:&ReadParse(*in); 此例中,陣列名是in, 可以隨便取名的. 在表單輸入解碼后, 你能讀取和處理這個(gè)name/value,方法是象下面這樣:print $in{'theName'}; 這個(gè)將顯示名字name是theName的值value. 如果你有多個(gè)用同樣名字的name對, cgi-lib.pl用(\0)分隔多個(gè)名字. 這樣可以正常處理你的腳本.
解碼上傳的文件輸入
基于表單的文件上傳需要不同的表單輸入,有一些程序可以對其進(jìn)行解碼。cgi-lib.pl 后來(lái)版本可以很好支持這個(gè)功能, 在
http://www.bio.cam.ac.uk/cgi-lib/ 了解更多的情況. 另一個(gè)處理用Perl編寫(xiě)的CGI地址是
http://valine.ncsa.uiuc.edu/cgi_docs.html .
自己做
找專(zhuān)門(mén)書(shū)籍學(xué)習吧:
ftp://ds.internic.net/rfc/rfc1867.txt.非解剖的腳本頭部
按照本書(shū)闡述,大多數情況可以正常操作,在一些情況下不是這樣的,你可以翻閱說(shuō)明書(shū)了解。<ISINDEX> 腳本
為了在CGI中完成討論組, 我們看看叫<ISINDEX>的搜索. 這是早期在瀏覽器中用來(lái)向服務(wù)器發(fā)出搜索關(guān)鍵字的辦法,參看以前的資料??偨Y
CGI腳本, 有時(shí)叫服務(wù)器端腳本或網(wǎng)關(guān)腳本。 在internet上有很多免費資源,你可以搜索下載讀懂他們,當然都是英文的,如果你下決心翻譯他們(可能更加強理解). 這樣一舉兩得啊. 注意:上述程序可以用ultra edit來(lái)編輯,注意轉換UNIX格式 ,必須采用UNIX格式存盤(pán),再上載,用telnet登陸,在命令行鍵入perl sample.pl,看有無(wú)bug,再 在瀏覽器中調用。CGI程序包括放置CGI的目錄一定要改屬性為777, 要寫(xiě)入的HTML文件也要改屬性為777.