亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 學(xué)院 > 編程設(shè)計(jì) > 正文

CGI腳本入門學(xué)習(xí)資料

2020-01-31 16:13:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友


    學(xué)習(xí)CGI腳本(腳本)

    CGI 意思為 Common Gateway Interface, 一種基于瀏覽器的輸入、在Web服務(wù)器上運(yùn)行的程序方法. CGI腳本 使你的瀏覽器與用戶能交互,為了在數(shù)據(jù)庫(kù)中尋找一個(gè)名詞, 提供你寫入的評(píng)論,或者從一個(gè)表單中選擇幾個(gè)條目并且能得到一個(gè)明確的回答. 如果你曾經(jīng)遇到過(guò)在web上填表或進(jìn)行搜索, 你就是用的CGI腳本. 你那時(shí)也許沒(méi)有意識(shí)到,因?yàn)榇蟛糠止ぷ魇窃诜?wù)器上運(yùn)行的,你看到的只是結(jié)果.

    作為一個(gè)網(wǎng)頁(yè)設(shè)計(jì)者, 你創(chuàng)建客戶端的 CGI腳本, 服務(wù)器端的程序用來(lái)處理用戶輸入, 結(jié)果返回給用戶.

    在這里你將學(xué)習(xí)關(guān)于CGI腳本的一切:

    • CGI腳本是什么?它是怎樣工作的
    • 一個(gè)CGI腳本輸出象什么?
    • 怎樣用參數(shù)或無(wú)參數(shù)創(chuàng)建一個(gè)CGI腳本
    • 怎樣創(chuàng)建一個(gè)返回規(guī)定響應(yīng)的CGI腳本
    • 怎樣創(chuàng)建一個(gè)輸入表單的CGI腳本
    • 有關(guān)在使用CGI腳本中的問(wèn)題
    • 你能在腳本中使用的CGI變量

    本章節(jié)假設(shè)在UNIX系統(tǒng)下的。

    CGI腳本是什么?

    CGI腳本簡(jiǎn)單地講是個(gè)運(yùn)行在Web服務(wù)器上的程序, 有瀏覽器的輸入觸發(fā). 這個(gè)腳本通常象服務(wù)器和系統(tǒng)中其他程序如數(shù)據(jù)庫(kù)的橋梁。

    CGI 腳本難道不是一個(gè)真正的腳本?按照你的服務(wù)器的支持, 他們可能是一個(gè)編譯好的程序或者批命令文件或者其他可執(zhí)行的東西. 為了簡(jiǎn)單起見(jiàn),我們統(tǒng)稱他們?yōu)槟_本scripts.


    CGI 腳本是任何運(yùn)行在web服務(wù)器上的程序. CGI意思是Common Gateway Interface。  

    CGI腳本是用下列兩種方法使用的: 作為一個(gè)表單的ACTION 或 作為一個(gè)頁(yè)中的直接link。

    CGI腳本是怎樣工作的?

    CGI腳本有服務(wù)器調(diào)用, 基于瀏覽器的數(shù)據(jù)輸入. 圖1 顯示在瀏覽器、服務(wù)器和腳本之間是怎樣的一個(gè)流程.

    圖1. 從瀏覽器到服務(wù)器到腳本到程序 記住再回來(lái)噢!

    這有個(gè)簡(jiǎn)短的示意解釋:

    1. 一個(gè)URL指向一個(gè)CGI腳本. 一個(gè)CGI腳本的URL能如普通的URL一樣在任何地方出現(xiàn)。
    2. 服務(wù)器接收請(qǐng)求, 按照那個(gè)URL指向的腳本文件(注意文件的位置和擴(kuò)展名),執(zhí)行腳本.
    3. 腳本執(zhí)行基于輸入數(shù)據(jù)的操作,包括查詢數(shù)據(jù)庫(kù)、計(jì)算數(shù)值或調(diào)用系統(tǒng)中其他程序.
    4. 腳本產(chǎn)生某種Web服務(wù)器能理解的輸出結(jié)果.
    5. 服務(wù)器接收來(lái)自腳本的輸出并且把它傳回瀏覽器,讓用戶了解結(jié)果。
     

    一個(gè)簡(jiǎn)單的例子

    這里詳細(xì)一步一步地解釋所有有關(guān)發(fā)生的細(xì)節(jié)。
    在圖2中有個(gè)例圖:
    圖2. 帶有一個(gè)腳本連接的頁(yè).

    Display Date處是個(gè)指向CGI腳本的連接. 它的HTML是這樣的:

    <A >Display the Date</A>
    說(shuō)明是個(gè)CGI腳本是因?yàn)檫@里面有個(gè)cgi-bin的路徑. 在許多服務(wù)器cgi-bin是僅能夠放置CGI腳本的目錄.

    當(dāng)你選擇這個(gè)連接時(shí), 你的瀏覽器將向www.popchina.com服務(wù)器提出請(qǐng)求. 服務(wù)器接收這個(gè)請(qǐng)求計(jì)算出URL處的腳本文件名然后執(zhí)行這個(gè)腳本.

    這個(gè)getdate腳本, 在UNIX系統(tǒng)中執(zhí)行是這樣的:

    #!/bin/sh echo Content-type: text/plain echo /bin/date
    第一行是個(gè)特殊的命令,告訴UNIX系統(tǒng)這是個(gè)shell腳本; 真實(shí)的情況是從這行開(kāi)始的下一行,這個(gè)腳本做兩件事:它輸出行Content-type: text/plain, 接著開(kāi)始一個(gè)空行;第二, 它調(diào)用UNIX系統(tǒng)時(shí)間date程序, 這樣輸出日期和時(shí)間. 腳本執(zhí)行后輸出應(yīng)該這樣:
    Content-type: text/plain Tue Oct 25 16:15:57 EDT 1994
    這個(gè)Content-type是什么東東?它是個(gè)特殊的編碼,Web服務(wù)器用來(lái)告訴瀏覽器輸出這個(gè)文本是什么類型的. 這與HTML中Content-type含義是一樣的。

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

    圖3 date腳本輸出結(jié)果.

    這是最基本的,實(shí)際情況要復(fù)雜得多,總之可以用來(lái)理解瀏覽器、服務(wù)器和腳本之間是怎樣工作的。

    我能用CGI腳本嗎?

    在你使用CGI腳本之前,有兩件事你也許要解決:CGI腳本 是個(gè)高級(jí)的Web特性并且需要你和Web  服務(wù)器管理者一樣好的知識(shí)。

    肯定嗎?就是做不到,學(xué)學(xué)也可以?好吧!讓我們繼續(xù).

    你的服務(wù)器配置允許CGI腳本嗎?

    為了能寫和運(yùn)行CGI腳本, 你需要一個(gè)Web服務(wù)器. 不象通常的HTML文件, 你不能在本地系統(tǒng)上寫或試驗(yàn)?zāi)愕腃GI腳本; 你得通過(guò)Web服務(wù)器來(lái)做這個(gè).

    但是即使你有一個(gè)Web服務(wù)器, 這個(gè)服務(wù)器必須特別地為運(yùn)行CGI腳本配置一下. 那意味著你所有的腳本必須放置在一個(gè)叫做cgi-bin的目錄下.

    在編寫CGI腳本之前, 詢問(wèn)你的服務(wù)器管理者是否允許你安裝和運(yùn)行CGI腳本, 并且如果可以的話,他們必須放置在哪兒?還有,你必須有個(gè)真正的Web服務(wù)器,如果是FTP或Gopher服務(wù)器,那你就不能用CGI.

    如果你在自己的服務(wù)器上運(yùn)行, 你必須特別地創(chuàng)造一個(gè)叫cgi-bin的目錄,并配置你的服務(wù)器認(rèn)可這個(gè)目錄為一個(gè)腳本目錄. 也必須記住下面有關(guān)CGI腳本特點(diǎn):

    • 每個(gè)腳本是個(gè)程序, 它運(yùn)行在瀏覽器可以請(qǐng)求的系統(tǒng)上, 執(zhí)行時(shí)使用CPU時(shí)間和內(nèi)存. 如果有成打上千的這些腳本同時(shí)運(yùn)行,會(huì)怎樣?你的系統(tǒng)將不忍負(fù)載直至崩潰。
    • 如果你不仔細(xì)地編寫你的CGI腳本, 你將有可能讓別人通過(guò)你的CGI腳本參數(shù)進(jìn)入傷害你的系統(tǒng).

    你會(huì)編程嗎?

    初學(xué)者注意! 一般地, 你必須具備一些基本編程概念與方法。你必須有類似系統(tǒng)工作的經(jīng)驗(yàn)。如果你沒(méi)有這些背景, 你必須去學(xué)習(xí),好了,費(fèi)話不多說(shuō).

    你必須用什么編程語(yǔ)言?

    你可以用你熟悉的任何語(yǔ)言編寫CGI腳本, 只要你的腳本遵守下一節(jié)所陳列的規(guī)則即可,只要那個(gè)語(yǔ)言能在你的Web服務(wù)器系統(tǒng)上運(yùn)行.

    在這本學(xué)習(xí)手冊(cè)中,僅用兩種語(yǔ)言編寫CGI腳本: UNIX shell和 Perl語(yǔ)言. 這個(gè)shell是適合在任何相近的UNIX系統(tǒng)上運(yùn)行并且容易學(xué)習(xí), 但是處理復(fù)雜的情況就困難了. Perl, 就要用這個(gè)語(yǔ)言了, 它是免費(fèi)的, 這個(gè)語(yǔ)言是穩(wěn)定和強(qiáng)大的,類似C,但它也是較難學(xué)習(xí)的.

    你的服務(wù)器設(shè)置正確了嗎?

    為了運(yùn)行任何一個(gè)CGI腳本, 不管簡(jiǎn)單或復(fù)雜的,你的服務(wù)器必須設(shè)置成能夠運(yùn)行他們,必須放置在一個(gè)特定的目錄,必須有一個(gè)依賴你服務(wù)器設(shè)定的文件擴(kuò)展名.

    如果你是租用服務(wù)器,就要是否允許運(yùn)行CGI腳本.

    如果你擁有自己的服務(wù)器,檢查你的服務(wù)器說(shuō)明書(shū)是怎樣處理CGI腳本的.

    如果你用的不是UNIX?

    只好再找別的學(xué)習(xí)手冊(cè)了。

    解剖一個(gè)CGI腳本

    如果你編寫它很久,克服很多警告和配置,恭喜你,你已經(jīng)會(huì)些CGI腳本,并且可以在你的網(wǎng)頁(yè)上使用了. 在這一章,將學(xué)習(xí)腳本是怎樣執(zhí)行,你的服務(wù)器又是怎樣與他們對(duì)話產(chǎn)生回應(yīng)的。

    輸出頭部

    雖然你的CGI腳本可以讓你做任何事情,但是腳本的輸出還是必須有一個(gè)規(guī)定形式.

    這個(gè) "腳本輸出" 意思是指你的腳本發(fā)回服務(wù)器的數(shù)據(jù). 在UNIX系統(tǒng)中, 輸出是發(fā)向標(biāo)準(zhǔn)輸出, 服務(wù)器從那兒檢測(cè)它. 在其他系統(tǒng)和服務(wù)器, 你的腳本輸出也許不一樣了.

    這個(gè)頭部是實(shí)際不是文本的一部分,是服務(wù)器與瀏覽器之間的信息協(xié)議,你實(shí)際看不到。

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

    有關(guān)content-type解釋可以見(jiàn)有關(guān)HTML的說(shuō)明, 一個(gè)你可以發(fā)出的特定編碼象這樣:

    Content-type: text/html
    在這個(gè)例子中,輸出數(shù)據(jù)的類型是text/html; 換句話說(shuō), 他是個(gè)HTML文件.
      表1. 通用格式和content-types.
     
    Format
    Content-Type
    HTMLtext/html
    Texttext/plain
    GIFimage/gif
    JPEGimage/jpeg
    PostScriptapplication/postscript
    MPEGvideo/mpeg
    注意content-type 后面必須跟一個(gè)空行. 如果你沒(méi)有空行,服務(wù)器將無(wú)法搞清這個(gè)頭部在哪里結(jié)束。

    輸出數(shù)據(jù)

    你輸出的數(shù)據(jù)應(yīng)該符合你所規(guī)定的content-type; 如果content-type是text/html, 輸出安置應(yīng)該是在HTML. 如果content-type是image/gif, 輸出應(yīng)該是在一個(gè)二進(jìn)制的GIF文件.
    練習(xí)1: 小試試.
    T這是個(gè)簡(jiǎn)單的輸出日期的簡(jiǎn)單腳本,這個(gè)CGI腳本還檢查看看我是否已經(jīng)登陸到我的Web服務(wù)器,并且報(bào)告發(fā)現(xiàn)了什么(如在圖4).

    圖4. 腳本的結(jié)果
    這是個(gè)很簡(jiǎn)單的例子, 他能這樣備調(diào)用:

    <A >Is Laura Logged in?</A>
    這是沒(méi)有輸入的腳本,它只運(yùn)行并且返回?cái)?shù)據(jù).

    根據(jù)前面的闡述,這個(gè)腳本內(nèi)容是這樣::
    #!/bin/sh
     

    echo Content-type: text/html
     

    echo "<HTML><HEAD>"
     

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

    echo "</HEAD><BODY>"
    為了測(cè)試我是否已經(jīng)登陸系統(tǒng),用who命令(我的登陸名假設(shè)為lemay), 儲(chǔ)存結(jié)果在變量ison中. 如果我登陸, 變量ison將有些內(nèi)容,否則則是空的.

    ison='who | grep lemay'
    試驗(yàn)結(jié)果及返回相應(yīng)提示的腳本是這樣:
    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>"
    現(xiàn)在你通過(guò)從命令行運(yùn)行他,測(cè)試一下,你將得到一個(gè)結(jié)果說(shuō)我未登陸你的系統(tǒng),當(dāng)然不可能的,他的輸出是這樣的:
    Content-type: text/html <HTML><HEAD> <TITLE>Are You There?</TITLE> </HEAD><BODY> <P>Laura is not logged in. </BODY></HTML>
    這是輸出的一個(gè)HTML文本,這樣你的瀏覽器能正常顯示他,因?yàn)樗莻€(gè)HTML文件。


     


    現(xiàn)在將他copy到你的服務(wù)器的cgi-bin目錄下,去執(zhí)行,如果你不能達(dá)到CGI-bin目錄,你必須詢問(wèn)你的服務(wù)器管理者,你不能理所當(dāng)然地自己建立個(gè)CGI-bin目錄,那沒(méi)用的。

    這個(gè)例子完整的腳本如下:

    #!/bin/sh echo "Content-type: text/html" echo echo "<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" fi echo "</BODY></HTML>"

    帶有參數(shù)的腳本

    為了傳遞一個(gè)參數(shù)給腳本,可以在URL中使用 (?) 插入腳本名詞和參數(shù)之間, 用加號(hào)(+) 表示每個(gè)單一的參數(shù), 如:
    <A HREF="/cgi-bin/myscript?arg1+arg2+arg3">run my script</A>
    當(dāng)服務(wù)器接收到這個(gè)請(qǐng)求,它傳遞 arg1, arg2, 和 arg3 參數(shù)給腳本. 你然后能在腳本中使用這些參數(shù).

    這個(gè)方法有時(shí)叫查詢, 因?yàn)樵缙谒迷谒阉鞴δ苤?

    練習(xí)2: 檢查是否有人登陸.
    既然你知道怎樣使用參數(shù),讓我們繼續(xù)上面的例子pinglaura,通過(guò)修改這個(gè)例子我們得到下面這個(gè)腳本pinggeneric.

    我們?nèi)€(gè)不同題目:

    #!/bin/sh echo "Content-type: text/html" echo echo "<HTML><HEAD>" echo "<TITLE>Are You There?</TITLE>" echo "</HEAD><BODY>"
    在上面的例子中, 下一步應(yīng)該是測(cè)試我是否登陸,在這里我們用參數(shù)${1}代替我的名字lemay,  ${1}作為第一個(gè)參數(shù), ${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" fi
    echo "</BODY></HTML>"
    好了,讓我們修改HTML頁(yè)中的連接吧!原來(lái)是這樣:
    <A >Is Laura Logged in?</A>
    修改為通用查詢功能后是這樣,比如查詢名字叫john的人是否登陸:
    <A >Is John Logged in?</A>
    在你的服務(wù)器上試試,看是否有結(jié)果。

    傳遞其他信息給腳本

    有第二種方法傳遞信息給CGI腳本. 它叫作路徑信息path information 用作那些在腳本調(diào)用是不用變更的參數(shù), 象一個(gè)臨時(shí)文件名或調(diào)用腳本自己的文件名. 正如你看到的,在上面的例子問(wèn)號(hào)后面的參數(shù)是因用戶表單的輸入而改變的. 路徑信息Path info用作其他信息傳遞給腳本,實(shí)際上,你可以用它作任何事情.

    路徑信息Path information是一種不象通常參數(shù)腳本那樣頻繁傳遞信息的方法. 路徑Path information通常是指Web服務(wù)器上的那些比如配置文件、臨時(shí)文件或者被腳本因問(wèn)題調(diào)用的文件等等此類文件.  

    看下面一個(gè)路徑信息path information例子, :

    http://myhost/cgi-bin/myscript/remaining_path_info?arg1+arg2
    當(dāng)腳本運(yùn)行時(shí),在路徑中的信息將被放置于環(huán)境參數(shù)PATH_INFO. 你能在你的腳本內(nèi)容中使用這些信息.

    比如說(shuō), 讓我們假設(shè)你在多頁(yè)上已有多個(gè)連接到同一個(gè)腳本. 你能用這個(gè)路徑信息顯示那個(gè)有連接的HTML文件名. 這樣, 在你完成處理你的腳本之后, 當(dāng)你發(fā)回一個(gè)HTML文件時(shí), 你能在這個(gè)文件里包含一個(gè)連接,發(fā)回用戶一開(kāi)始那個(gè)頁(yè)。

    你會(huì)在下一章節(jié)學(xué)到更多路徑信息:有用的表單和腳本. 待后來(lái)登出

    創(chuàng)建一個(gè)特殊的腳本輸出

    現(xiàn)在你已經(jīng)學(xué)習(xí)了諸如輸出數(shù)據(jù) 一般地HTML數(shù)據(jù) 發(fā)給瀏覽器解釋顯示的數(shù)據(jù). 但是如果你不想把腳本結(jié)果作為一個(gè)數(shù)據(jù)流形式發(fā)回瀏覽器,而是想把一個(gè)存在的頁(yè)發(fā)回,怎么辦? 如果你只是要腳本做一些事而不讓任何結(jié)果回答給瀏覽器,怎么辦?

    不用怕, 這里開(kāi)始解釋這些情況.

    用調(diào)用另一個(gè)文本作為響應(yīng)

    CGI輸出不是非得一個(gè)數(shù)據(jù)流,有時(shí)可以告訴瀏覽器是存在服務(wù)器上的一個(gè)頁(yè),為了發(fā)出這個(gè)信息,看下面的例子:
    Location: ../docs/final.html
    這個(gè)Location行用作通常的輸出位置,也就是說(shuō),如果你用了Location, 你就不必再用象Content-type這樣的數(shù)據(jù)輸出(實(shí)際上,你也不能). 正如Content-type, 你也必須在這一行后面跟一個(gè)空行.

    指向這個(gè)文件的路徑可以是一個(gè)URL或相對(duì)路徑. 所有相對(duì)路徑是指相對(duì)于腳本所在的位置. 例子中的final.html文本是在當(dāng)前上一個(gè)目錄下docs的目錄下:

    echo Location: ../docs/final.html echo

    你不能Content-type 和 Location兩個(gè)輸出同時(shí)使用. 比如, 如果你想輸出一個(gè)標(biāo)準(zhǔn)頁(yè),但是想在這個(gè)頁(yè)尾加上客戶的內(nèi)容, 你就得用Content-type自行組建這兩個(gè)部分. 注意:你可以用腳本命令打開(kāi)一個(gè)當(dāng)?shù)匚募鳛閿?shù)據(jù)直接將之輸出.

    No Response

    有時(shí)對(duì)于一個(gè)CGI腳本也許一點(diǎn)沒(méi)有輸出. 有時(shí)你只是要從用戶那兒收集點(diǎn)信息. 你就不用再調(diào)用一個(gè)新文本, 也不用輸出結(jié)果或打開(kāi)一個(gè)存在的文件. 在瀏覽器上的屏幕還是那個(gè)樣子.

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

    echo Status: 204 No Response echo
    這個(gè)Status頭部提供狀態(tài)碼給服務(wù)器(并且也給瀏覽器). 特別的204將傳遞給瀏覽器,如果能識(shí)別它,它將什么也不做.


     


    盡管無(wú)響應(yīng)是一個(gè)官方HTTP規(guī)定的一部分,但也并不是適合所有的瀏覽器,也許會(huì)產(chǎn)生奇怪的結(jié)果,那你要多試驗(yàn)試試看啦.

    處理表單的腳本

    今天,大多數(shù)CGI腳本是用來(lái)處理表單輸入的. 這個(gè)過(guò)程大致象上面說(shuō)闡述的一樣,但還是有些不同,比如CGI腳本只要被調(diào)用;數(shù)據(jù)怎樣從服務(wù)器被發(fā)向?yàn)g覽器.

    記住, 大多數(shù)表單有兩個(gè)部分: HTML的表單格式;處理表單數(shù)據(jù)的CGI腳本. 這個(gè)CGI腳本使用標(biāo)簽<FORM>屬性調(diào)用的.

    表單形式和表單腳本

    正如上面所說(shuō),由于表單有兩個(gè)部分. 如下:

    這個(gè)ACTION屬性包含著處理表單的腳本:

    <FORM ACTION="http://www.popchina.com/cgi-bin/processorscript">
    在這個(gè)表單中, 每個(gè)輸入?yún)^(qū)都有一個(gè)NAME的屬性, 用來(lái)稱呼表單元素. 當(dāng)這個(gè)表單數(shù)據(jù)被遞交給你在ACTION中定義的CGI腳本, 這樣這些name和輸入內(nèi)容被作為一個(gè)數(shù)字或字符傳遞給腳本.

    GET 和 POST

    表單從瀏覽器發(fā)給服務(wù)器有兩種方法.  GET 和 POST.

    我們上面談?wù)摰姆椒?,?shí)際是GET,它將數(shù)據(jù)打包放置在環(huán)境變量QUERY_STRING中作為URL整體的一部分傳遞給服務(wù)器。

    POST做很多類似GET同樣的事情, 不同的地方就是它是分離地傳遞數(shù)據(jù)給腳本. 你的腳本通過(guò)標(biāo)準(zhǔn)輸入獲取這些數(shù)據(jù). (有些Web服務(wù)器是存儲(chǔ)在臨時(shí)文件中.) 這個(gè)QUERY_STRING環(huán)境變量將不再設(shè)置.

    那你用那個(gè)方法呢? POST是個(gè)安全的方法, 尤其如果你的表單中有很多數(shù)據(jù)的話. 當(dāng)你用GET, 這個(gè)服務(wù)器就分配變量QUERY_STRING給所有的表單數(shù)據(jù), 但是這個(gè)變量可存儲(chǔ)量是有限的. 換句話說(shuō),如果你有很多數(shù)據(jù)但是你又用GET,你會(huì)丟失很多數(shù)據(jù).

    如果你用POST, 你可以盡可能多地使用數(shù)據(jù), 因?yàn)檫@些數(shù)據(jù)從來(lái)也不分配到一個(gè)變量里.

    URL 編碼

    URL 編碼是一種瀏覽器用來(lái)打包表單輸入的格式. 瀏覽器從表單中獲取所有的name和其中的值,將他們作為name/value參數(shù)編碼, 移去那些不能傳送的字符, 將數(shù)據(jù)排行等等,這些還取決于你用GET還是POST?作為URL的一部分或者分離地發(fā)給服務(wù)器. 不管哪種情況, 在服務(wù)器端的表單輸入格式樣子象這樣:
    theName=Ichabod+Crane&gender=male&status=missing&headless=yes
    URL編碼遵循下列規(guī)則:
    • 每對(duì)name/value由&符分開(kāi).
    • 每對(duì)來(lái)自表單的name/value由=符分開(kāi). 如果用戶沒(méi)有輸入值給這個(gè)name,那么這個(gè)name還是出現(xiàn),只是無(wú)值(象這樣 "name=").
    • 任何特殊的字符(就是那些不是簡(jiǎn)單的七位ASCII,如漢字) 將以百分符%用十六進(jìn)制編碼. 當(dāng)然也包括象 =, &, 和 % 這些特殊的字符.
    • 在輸入?yún)^(qū)中的空格將以加號(hào)+顯示.
    因?yàn)楸韱屋斎胧怯眠@個(gè)URL編碼傳遞給你的腳本的,在你用這些參數(shù)之前必須解碼,因?yàn)榻獯a是個(gè)很普遍的工作,可以有很多工具做這個(gè)工作 . 你沒(méi)有必要自己寫這個(gè)解碼程序.

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

    練習(xí)3: 告訴我你的名字.
    讓我們以這個(gè)例子來(lái)說(shuō)明,如圖5.

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

    這個(gè)輸入被發(fā)給腳本, 然后發(fā)回顯示一個(gè)hello的信息(間圖.6).

    如果你在姓名輸入處不輸入任何東東,會(huì)怎樣?見(jiàn)圖7.

    圖6. 姓名表單的結(jié)果.

    圖7. 另一個(gè)結(jié)果.

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

    在腳本中第一步是解碼,在這個(gè)例子中, 我們已經(jīng)使用uncgi解碼輸入數(shù)據(jù), 實(shí)際這個(gè)表單已經(jīng)為你做好解碼. 通過(guò)建立一個(gè)uncgi的目錄,一旦表單遞交給服務(wù)器,服務(wù)器會(huì)自動(dòng)進(jìn)行解碼,這樣,所有的name/value已經(jīng)準(zhǔn)備就緒等待你的使用.

    現(xiàn)在,一個(gè)例子開(kāi)始部分假設(shè)是下面這樣:

    echo Content-type: text/html echo echo "<HTML><HEAD>" echo "<TITLE>Hello</TITLE>" echo "</HEAD><BODY>" echo "<P>"
    接下來(lái),有兩種情況要處理:一件是處理用戶不輸入名字的情況,一個(gè)是如果輸入了向他們說(shuō)hello.

    這個(gè)Name元素的值, 是包含在WWW_theName環(huán)境變量中. 用一個(gè)簡(jiǎn)單的測(cè)試命令(-z), 你能查看環(huán)境變量是否是空的還是包括相應(yīng)的輸出值:

    if [ ! -z "$WWW_theName" ]; then     echo "Hello, "     echo $WWW_theName else     echo "You don't have a name?" fi
    最后增加一個(gè)連接"go back" . 用來(lái)返回:
    echo "</P><P><A HREF="../lemay/name1.html">Go Back</A></P>" echo "</BODY></HTML>"
     

    問(wèn)題

    這里是使用CGI腳本比較普遍的問(wèn)題:
    • 腳本內(nèi)容只顯示不執(zhí)行.

      你正確配置了你的服務(wù)器運(yùn)行CGI腳本? 你的腳本是放置在cgi-bin目錄中嗎?如果你的服務(wù)器允許帶.cgi擴(kuò)展名的CGI運(yùn)行, 你的腳本文件名的擴(kuò)展名是這樣嗎?

    • Error 500: Server doesn't support POST.

      解答還是如上一條一樣,然后你用命令行執(zhí)行你的CGI,可以正常運(yùn)行嗎?是否有錯(cuò)誤?.

    • Document contains no data.

      確定你的頭部行和數(shù)據(jù)部之間有一空行.

    • Error 500: Bad Script Request.

      確定你的腳本是可執(zhí)行的(在UNIX, 用chmod +x 你的腳本.cgi). 在從瀏覽器運(yùn)行之前,你應(yīng)當(dāng)從命令行運(yùn)行你的腳本,如果客戶端是win95,可以用telnet登陸你的服務(wù)器,執(zhí)行命令行,當(dāng)然必須了解UNIX命令.

    CGI變量

    表2 總結(jié)那些環(huán)境變量.
      表2. CGI 環(huán)境變量.
     
    環(huán)境變量         
    意義
    SERVER_NAMECGI腳本運(yùn)行時(shí)的主機(jī)名和IP地址.
    SERVER_SOFTWARE你的服務(wù)器的類型如: CERN/3.0 或 NCSA/1.3.
    GATEWAY_INTERFACE運(yùn)行的CGI版本. 對(duì)于UNIX服務(wù)器, 這是CGI/1.1.
    SERVER_PROTOCOL服務(wù)器運(yùn)行的HTTP協(xié)議. 這里當(dāng)是HTTP/1.0.
    SERVER_PORT服務(wù)器運(yùn)行的TCP口,通常Web服務(wù)器是80.
    REQUEST_METHODPOST 或 GET, 取決于你的表單是怎樣遞交的.
    HTTP_ACCEPT 瀏覽器能直接接收的Content-types, 可以有HTTP Accept header定義.
    HTTP_USER_AGENT遞交表單的瀏覽器的名稱、版本 和其他平臺(tái)性的附加信息。
    HTTP_REFERER遞交表單的文本的 URL,不是所有的瀏覽器都發(fā)出這個(gè)信息,不要依賴它
    PATH_INFO附加的路徑信息, 由瀏覽器通過(guò)GET方法發(fā)出.
    PATH_TRANSLATED在PATH_INFO中系統(tǒng)規(guī)定的路徑信息.
    SCRIPT_NAME指向這個(gè)CGI腳本的路徑, 是在URL中顯示的(如, /cgi-bin/thescript).
    QUERY_STRING腳本參數(shù)或者表單輸入項(xiàng)(如果是用GET遞交). QUERY_STRING 包含URL中問(wèn)號(hào)后面的參數(shù).
    REMOTE_HOST遞交腳本的主機(jī)名,這個(gè)值不能被設(shè)置.
    REMOTE_ADDR遞交腳本的主機(jī)IP地址.
    REMOTE_USER遞交腳本的用戶名. 如果服務(wù)器的authentication被激活,這個(gè)值可以設(shè)置。
    REMOTE_IDENT如果Web服務(wù)器是在ident (一種確認(rèn)用戶連接你的協(xié)議)運(yùn)行, 遞交表單的系統(tǒng)也在運(yùn)行ident, 這個(gè)變量就含有ident返回值.
    CONTENT_TYPE如果表單是用POST遞交, 這個(gè)值將是 application/x-www-form-urlencoded. 在上載文件的表單中, content-type 是個(gè) multipart/form-data.
    CONTENT_LENGTH對(duì)于用POST遞交的表單, 標(biāo)準(zhǔn)輸入口的字節(jié)數(shù).

    表單輸入的解碼程序

    目前有兩個(gè)程序: 通用目的的uncgi, 和cgi-lib.pl, 這是個(gè)Perl庫(kù),用于perl編寫的CGI腳本.

    當(dāng)然也有表單上載時(shí)可以解碼的程序,很少。

    uncgi

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

    cgi-lib.pl

    這是由Steve Brenner編寫的, 幫助你管理輸入. 他能從GET和POST獲取輸入并且放置在一個(gè)Perl列表或陣列中. 更新的版本也能處理來(lái)自表單的文件上傳. 從這兒可以得到信息與原碼 http://www.bio.cam.ac.uk/cgi-lib. 如果你決定用Perl語(yǔ)言處理你的表單輸入,cgi-lib是個(gè)很好的庫(kù).

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

    require 'cgi-lib.pl';
    cgi-lib中盡管有很多子程序, 最重要的是ReadParse子程. ReadParse 讀取輸入方便地將name/value儲(chǔ)存在一個(gè)Perl陣列中. 在你的Perl腳本中通常是這樣調(diào)用的:
    &ReadParse(*in);
    此例中,陣列名是in, 可以隨便取名的.

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

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

    如果你有多個(gè)用同樣名字的name對(duì), cgi-lib.pl用(/0)分隔多個(gè)名字. 這樣可以正常處理你的腳本.

    解碼上傳的文件輸入

    基于表單的文件上傳需要不同的表單輸入,有一些程序可以對(duì)其進(jìn)行解碼。

    cgi-lib.pl 后來(lái)版本可以很好支持, 在http://www.bio.cam.ac.uk/cgi-lib/ 了解更多的情況.

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

    自己做

    找專門書(shū)籍學(xué)習(xí)吧: ftp://ds.internic.net/rfc/rfc1867.txt.

    非解剖的腳本頭部

    按照本書(shū)闡述,大多數(shù)情況可以正常操作,在一些情況下不是這樣的,你可以翻閱說(shuō)明書(shū)了解。

    <ISINDEX> 腳本

    為了在CGI中完成討論組, 我們看看叫<ISINDEX>的搜索. 這是早期在瀏覽器中用來(lái)向服務(wù)器發(fā)出搜索關(guān)鍵字的辦法,參看以前的資料。

    總結(jié)

    CGI腳本, 有時(shí)叫服務(wù)器端腳本或網(wǎng)關(guān)腳本。 在internet上有很多免費(fèi)資源,你可以搜索下載讀懂他們,當(dāng)然都是英文的,如果你下決心翻譯他們(可能更加強(qiáng)理解). 這樣一舉兩得啊.

    注意:上述程序可以用ultra edit來(lái)編輯,注意轉(zhuǎn)換UNIX格式 ,必須采用UNIX格式存盤,再上載,用telnet登陸,在命令行鍵入perl sample.pl,看有無(wú)bug,再 在瀏覽器中調(diào)用。CGI程序包括放置CGI的目錄一定要改屬性為777, 要寫入的HTML文件也要改屬性為777.

    現(xiàn)在網(wǎng)上有很多免費(fèi)的cgi,基本可以滿足一般需求,請(qǐng)到這個(gè)網(wǎng)址查詢你要的cgi:http://www.itm.com/cgicollection/

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

    發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表

    圖片精選

    日韩女同强女同hd| 在线观看国产成人av片| 国产欧美日韩精品在线| 国产在线视频欧美一区| 国产精品99久久久久久大便| 国产一级淫片a| 九九热国产精品视频| 免费在线视频你懂得| 美脚丝袜一区二区三区在线观看| 欧美日韩精品区| 91婷婷韩国欧美一区二区| 男男做爰猛烈叫床爽爽小说| 日韩黄色片在线| 夜夜爽av福利精品导航| 欧美日韩人人澡狠狠躁视频| 欧美成人免费一级人片100| 国产精品资源网站| 成人女保姆的销魂服务| 亚洲国产综合视频在线观看| 国产亚洲高清在线观看| 久久久一二三四| 欧美少妇一级片| 欧美精品久久久久久久多人混战| 国产精品毛片一区二区三区| 精品国偷自产在线视频| 色操视频在线| 97青娱国产盛宴精品视频| 狠狠综合久久av| 日韩特级黄色片| av在线com| 97超碰人人在线| 青青在线免费观看视频| 四虎一区二区三区| 伊人影院蕉久552| 亚洲波多野结衣| 欧美性巨大欧美| 九九99久久| 久久丫精品国产亚洲av不卡| 五月婷中文字幕| 五月天激情播播| 欧美视频中文字幕| 国产精品成人久久久| 成人黄色国产精品网站大全在线免费观看| 毛茸茸free性熟hd| 中文字幕欧美亚洲| 亚洲三级网页| 91在线小视频| 啊啊啊啊啊啊啊视频在线播放| 欧美国产日本视频| 日韩经典中文字幕一区| 成人美女黄网站| 成人爽a毛片免费啪啪动漫| 欧美色欧美亚洲另类七区| 黄色免费观看视频网站| 天堂…中文在线最新版在线| 中文字幕亚洲精品乱码| 亚洲一区二区中文字幕| 18岁视频在线观看| 最新国产中文字幕| 国产美女99p| 136福利精品导航| 日韩成人毛片视频| 一本一道综合狠狠老| 毛片在线视频播放| 欧美成人免费网站| 久久精品无码人妻| 国产精品久久久av久久久| 性欧美1819| yw193.com尤物在线| 999久久久免费精品国产牛牛| 男人天堂视频网| 欧美精品粉嫩高潮一区二区| 激情亚洲影院在线观看| 青青草免费av| 欧美在线视屏| 在线观看色网站| 成人av在线天堂| 精品久久久久久无码中文野结衣| 尤物九九久久国产精品的分类| 国产传媒免费在线观看| 欧美中文字幕视频在线观看| 五月开心婷婷久久| 丝袜美女写真福利视频| 天堂资源在线| 国产a视频免费观看| 亚洲男人影院| 日韩福利二区| a视频在线看| 91免费综合在线| 人妻少妇无码精品视频区| 男人的天堂在线视频免费观看| 欧美视频中文字幕| 制服丝袜国产精品| 色婷婷综合久久久久久| 污视频在线看网站| 成年人免费看的视频| 成人一区在线观看| 国产精品最新乱视频二区| 国产91精品入口17c| 一级欧美一级日韩片| 51午夜精品视频| 精品人妻无码一区二区| 最新版天堂资源中文官网| aaa在线免费观看| 亚洲永久精品唐人导航网址| 国内精品国产三级国产99| 天堂日韩电影| 男女午夜刺激视频| 久久精品亚洲| 国产一区二区三区乱码| 一区二区国产日产| 精品久久久久中文字幕小说| 欧美激情午夜| 日本在线视频www鲁啊鲁| 美女精品网站| 欧美福利在线播放| 午夜激情影院| 免费黄色电影在线观看| 欧美日韩中文字幕精品| 久久五月天综合| 26uuu久久天堂性欧美| 综合中文字幕| 不用播放器成人网| 国产精品精品国产一区二区| 亚洲国产欧美国产第一区| 成人国产亚洲精品a区天堂华泰| 四虎影视在线观看2413| 久久久久亚洲av成人毛片韩| 日韩一区二区免费看| 国产精品国产三级国产aⅴ中文| 91插插插插插插插插| 国产精品视频在| 久久精品一区二区| 欧美日韩国产大片| 久久全球大尺度高清视频| eeuss性xxxxxx电影| 精品国产乱码久久久久夜深人妻| 高清国语自产拍免费一区二区三区| 亚洲天堂av图片| 日本女人一区二区三区| 在线观看免费看片| 性做久久久久久免费观看| 色999国产精品| 亚洲国产精品久久精品怡红院| 中文字幕日本三级| 国产日韩欧美中文字幕| 中文字幕资源网在线观看免费| 91精品国产综合久久久久久蜜臀| 国产精品九九| 91在线精品一区二区三区| 九义人在线观看完整免费版电视剧| 久热精品免费视频| 中文亚洲字幕| 国产精品无码av无码| 日韩成人免费观看| 91福利视频免费观看| 久久免费看毛片| 国产视频911| 日韩av电影手机在线观看| 免费一级suv好看的国产网站| 色在线视频观看| 成人一级片在线观看| 九七久久人人| 午夜国产在线视频| 一级特黄妇女高潮| 亚洲少妇诱惑| 久久精品视频在线观看榴莲视频| 自拍偷拍精品| 97国产超碰| 国产精品亚洲午夜一区二区三区| 最近中文字幕mv2018在线高清| 久久午夜免费电影| 亚洲制服丝袜一区| 亚洲自拍偷拍区| 97免费视频在线播放| 日韩亚洲国产中文字幕欧美| 国产欧美精品| 日韩一区二区精品葵司在线| 任我爽精品视频在线播放| 欧美激情在线观看视频| 福利视频1000| 欧美成人性生活| 成人国产视频在线观看| 极品美女一区二区三区视频| 日韩在线中文字| 九色91popny| 国产一级片免费| 国产精品高潮呻吟久久| 免费亚洲一区二区| 忘忧草在线www成人影院| 热久久最新地址| 精品一区日韩成人| 国产盗摄精品一区二区三区在线| 91免费精品国自产拍在线不卡| 免费精品一区二区三区在线观看| 亚洲午夜精品国产| 天堂在线一二区| 欧洲在线视频一区| 可以在线观看的av网站| 国产成人免费av电影| 亚洲国产日韩一区二区| jlzzjlzz国产精品久久| 欧美电影一二区| 麻豆亚洲av成人无码久久精品| 亚洲精品小区久久久久久| 国产高清精品一区二区三区| 国产精品久久在线| 91精品国产乱码久久久久| 91久久国产精品91久久性色| 1pondo在线播放免费| 久久久久久免费看| 九九视频免费看| 国内精品视频在线播放| 国产精选一区二区三区不卡催乳| 午夜精彩视频在线观看不卡| 色琪琪久久se色| 久草中文视频| 欧美黄色录像片| 亚洲国产日韩在线一区| www视频在线| www.99在线| 日本激情视频在线观看| 91欧美精品成人综合在线观看| 国产精品999久久久| 中文字幕无乱码| 日韩三级久久| 五月天色婷婷综合| 亚洲国产av一区二区三区| 精品捆绑调教一区二区三区| 成年人视频在线网站| 午夜私人影院在线观看| 欧美日韩卡一卡二| 亚洲午夜精品久久久久久性色| 国内高清免费在线视频| sese久久| 97在线精品国自产拍中文| 久久黄色免费视频| 天天色综合天天色| 精品国产乱码久久久久久久软件| 国产成人精品一区二三区四区五区| 精品久久久一区| 亚洲第一精品久久忘忧草社区| 欧洲亚洲女同hd| 日本一本在线免费福利| 国产精区一区二区| 国产精品美女久久久久久久久| 国产日韩中文字幕| 欧美肥婆xxxx欧美另类| 亚洲精品女人久久久| 中文字幕乱码久久午夜不卡| 日本成人在线视频网站| 国产成人综合一区二区三区| 青柠在线影院观看日本| 欧美三级午夜理伦三级老人| 国产欧美日韩在线看| 在线视频1卡二卡三卡| 男女一区二区三区免费| 国产美女无遮挡永久免费| eeuss影院www在线观看| 欧美天堂在线观看| 国产在线精品一区二区三区》| 国产精品成人**免费视频| 深夜福利一区二区三区| 四色成人av永久网址| 99精品欧美一区| www.久久久久久久久久久| 亚洲欧美自拍偷拍| 三级视频在线看| 亚洲精品日产aⅴ| 中国成人亚色综合网站| jizzzz日本| 亚洲精品国产一区黑色丝袜| 无码精品a∨在线观看中文| 国内精品免费| 成年人性生活视频| 日本高清视频网站www| 亚洲成**性毛茸茸| 欧美调教femdomvk| 日韩av地址| 亚洲精品一区二区三区区别| 日韩欧美中文字幕在线视频| 黄色短视频在线观看| 18涩涩午夜精品.www| 黄色网在线播放| 特级西西人体www高清大胆| 日韩欧美一区二区三区视频| www.爱色av.com| 国产亚洲精品久久久久久777| 美女视频久久黄| 久久99久久久久久| 手机福利小视频在线播放| 日韩在线观看网站| 奇米影视888狠狠狠777不卡| 成人免费短视频| 成人免费观看www在线| 亚洲精品看片| 亚洲成熟少妇视频在线观看| 精品国产亚洲av麻豆| 色影视在线观看| 亚洲免费在线看| 成人欧美一区二区三区的电影| 成人免费视频国产| 日韩免费性生活视频播放| 亚洲精品影院在线| 欧美a在线看| 欧美e片成人在线播放乱妇| av电影天堂一区二区在线观看| 在线观看视频你懂得| 偷拍盗摄高潮叫床对白清晰| 国产素人视频在线观看| 色欲一区二区三区精品a片| 9久久婷婷国产综合精品性色| 精品日韩美女| 成人黄网大全在线观看| 在线看片地址| 欧美一区国产在线| 日本免费在线视频不卡一不卡二| 日日摸夜夜添夜夜添精品视频| 伊人久久av| 十大黄色软件免费看| 国产精品99久久久久久www| 超碰91人人草人人干| 欧美特黄aaaaaaaa大片| 国产宾馆自拍| 国产乡下妇女三片| 国产成人综合欧美精品久久| www.8ⅹ8ⅹ羞羞漫画在线看| 欧美丰满少妇xxxxx高潮对白|