我在服務器上配置CGI程序開始用的是perl.exe,執行CGI程序都報:CGI ErrorThe specified CGI application misbehaved by not returning a complete set of HTTP headers.后來改用perlis.dll又提示:'E:\xxx\xxx\xx\ i' script produced no output 請教高手
熱心網友
我提供下列關于CGI的設計內容,希望能幫上你的忙……1。 定義:CGI(Common Gateway Interface)是HTTP服務器與你的或其它機器上的程序進行“交談”的一種工具,其程序須運行在網絡服務器上。2。 功能:絕大多數的CGI程序被用來解釋處理杰自表單的輸入信息,并在服務器產生相應的處理,或將相應的信息反饋給瀏覽器。CGI程序使網頁具有交互功能。3。 運行環境:CGI程序在UNIX操作系統上CERN或NCSA格式的服務器上運行。在其它操作系統(如:windows NT及windows95等)的服務器上也廣泛地使用CGI程序,同時它也適用于各種類型機器。4。 CGI處理步驟:⑴通過Internet把用戶請求送到服務器。⑵服務器接收用戶請求并交給CGI程序處理。⑶CGI程序把處理結果傳送給服務器。⑷服務器把結果送回到用戶。5。 CGI服務器配置:CGI程序不是放在服務器上就能順利運行,如果要想使其在服務器上順利的運行并準確的處理用戶的請求,則須對所使用的服務器進行必要的設置。配置:根據所使用的服務器類型以及它的設置把CGI程序放在某一特定的目錄中或使其帶有特定的擴展名。⑴CREN格式服務器的配置:編輯CREN格式服務器的配置文件通常為/etc/ nf/,在文件中加入:Exec cgi-bin/*/home/www/cgi-bin/*。exec。命令中出現的第一個參數cgi-bin/*指出了在URL中出現的目錄名字,并表示它出現在系統主機后的第一個目錄中,如: ⑵NCSA格式服務器的配置在NCSA格式服務器上有兩種方法進行設置:①在 nf文件(通常在conf目錄下)中加入:Script Alias/cgi-bin/cgi-bin/Script Alias命令指出某一目錄下的文件是可執行程序,且這個命令是用來執行這些程序的;此命令的兩個參數與CERN格式服務器中的Exec命令的參數的含意一樣。②在 nf文件加入:Add type application/ i此命令表示在服務器上增加了一種新的文件類型,其后第一個參數為CGI程序的MIME類型,第二個參數是文件的擴展名,表示以這一擴展名為擴展名的文件是CGI程序。在用上述方法之一設置服務器后,都得重新啟動服務器(除非HTTP服務器是用inetd啟動的)。6。 CGI的編寫語言CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變量。對初學者來說,最好選用易于歸檔和能有效表示大量數據結構的語言,例如UNIX環境中:· Perl (Practical Extraction and Reporting Language)· Bourne Shed或者Tcl (Tool Command Language)Windows環境中:· C和C++由于Internet上大部分服務器使用的是UNIX操作系統,且幾乎任一UNIX操作系統中都有Bourne Shell,因而后面講述的例子中大部分是用Bourne Shell編寫的。7。 CGI環境變量列表SERVER-NAME:運行CGI序為機器名或IP地址。SEUVER-INTERFACE:WWW服務器的類型,如:CERN型或NCSA型。SERVER-PROTOCOL:通信協議,應當是HTTP/1。0。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-NOST:發送程序的主機名,不能確定該值。REMOTE-ADDR:發送程序的機器的IP地址。REMOTE-USBR:發送程序的人名。CONTENT-TYPE:POST發送,一般為applioation/xwww-form-urlencoded。CONTENT-LENGTH:POST方法輸入的數據的字節數。1。CGI數據傳送方法:客戶有兩種方法:⑴通過環境變量,采用GET方式:…該法簡單,但用cethod=get方式通過變量傳送數據會因變量接受的數據量有限而產生數據丟失。⑵通過標準輸入,采用POST方式──建議使用方式標準輸入法是通過method=post方式把數據傳送到網關程序的入口。數據在傳輸中是經過URL編碼的,CGI程序在處理前需進行解碼,由于此法對數據量沒有限制,因而傳輸中不會產生數據丟失。2。輸入數據URL編碼URL編碼就是瀏覽器把表單輸入的數據傳送到服務器時,將輸入數據編碼、打包。從表單輸入的變量及其數值,被編碼為“參數名/參數值”,同時把那此不能直接傳輸的數據轉化為16進制。然后根據使用的是GET方法還是POST方法,把它作為URL的一部分或直接送到服務器。3。 CGI程序的特點CGI程序是一種在www服務器上運行的程序,主要用于處理用戶通過表單輸入的信息,在服務器上產生相應的作用,或把處理結果反饋給瀏覽器,CGI程序須符合以下兩個條件:⑴CGI程序的輸出要寫標準輸出這樣,服務器才能解釋這一輸出,并把它返回到瀏覽器。⑵CGI程序的數據頭要告訴服務器如何處理該程序的輸出為了使服務器能夠解釋CGI程序的輸出,CGI程序要有一個特殊的頭作為第一個輸出行,數據頭可以是下列三種之一:①數據類型(Content-type),如:Content-type: text/html② 地址類型(Location),如:Location://www。w3。0rg③狀態類型(Status), 如:Status:204 No Respouse4。CGI程序格式CGI程序同下列三部分構成:⑴數據解碼部分:由瀏覽器傳送給服務器的通過表單輸入的數據都是經過URL編碼的,必須進行解碼。如果不需要處理表單輸入,該部分可省略。⑵數據頭部分:必須包含這一部分作為第一個輸出行,該行后必須有一空格行。該行可以是下列三種之一:①數據類型(Content-type), 如:Content-type: text/html②地址類型(Location),如:Location:// ③狀態類型(Status), 如:Status:204 No Respouse⑶CGI程序主體部分:對通過表單輸入的數據進行處理,并輸出到標準輸出。5。CGI程序的數據類型:若服務器要把數據傳送給瀏覽器,則須在CGI程序中使用表示數據類型的頭,它將告訴瀏覽器如何解釋該輸入。例1:如服務器要判斷回一個HTML文件,則CGI程序中的類型頭應定義為:Content-type:text/html例2:如服務器要送回的文件類型是JEPG文件,則CGI程序中的類型頭應定義為:Contert-type:image/jpg其余的數據以此類推。6。CGI程序的地址類型若用戶想在服務器上打開或加載一個現有的文件,則須在CGI程序中使用表示地址類型的頭。表示地址類型的頭的值可以是一個URL全地址,也可以是去掉http:和主機名的URL地址。例1:Location: 例2:Location: 例3:Location: Book/ ml7。CGI程序的狀態類型如果在傳送最后服務器還要送一個特殊的狀態碼到瀏覽器,則須在CGI程序中加入表示狀態類型的頭。狀態碼由HTTP定義。例:Status: 204 No Response此狀態碼表示這時瀏覽器不能從服務器得到任何反饋信息,即服務器上的CGI程序只是對輸入進行處理而不作應答,瀏覽器界面保持不變。8。CGI程序示例下面是一個檢索約翰是否登錄的例子:#!/bin/sh 數據頭部分,聲明數據格式echo"Content-type:text/html" 為文本格式echo 此處省略了解碼部分echo""echo"約翰登錄了嗎?"echo""ison='who I grep lemay' 查詢登錄信自己 ,if[-z"Sison:]; 并向標準輸出設備then echo"約翰登錄"。 輸出查詢到的信息。elso echo"約翰未登錄"。fiecho""1。 處理表單的CGI程序表單允許用戶輸入各種信息,而通常CGI程序和帶參數的CGI程序不能處理客戶的輸入或只能處理帶硬編碼參數的程序。因此出現了專門處理表單的程序。處理表單的CGI程序的編寫須注意那些與表單有關的因素。編寫一般步驟為:⑴由于表單傳給CGI程序的數據是經URL編碼的,因而編寫前需調用cgiparse、uncgi或 程序對輸入進行解碼。⑵輸出標準數據類型標題,地址類型標題或狀態類型標題,這些標題后要以兩個\n(換行)字符結尾。第一個\n表示換行,第二個\n表示標題后面的空行。⑶輸出對應版面開頭部分的HTML程序。2。URL編碼規則URL編碼就是由瀏覽器把通過表單輸入的數據──變量/變量值轉化為參數/參數值,同時把那些不能直接傳輸的符號,如:&,%,+轉化為16進制。編碼規則:參數/參數值對之間用“&”分隔,空格用“+”代替參數與參數值之間用“=”分隔,如果參數未賦值,參數也同樣出現在編碼中,如:“姓名=”。一些特殊符號:&,%,+轉化為帶%的16進制數:%NN。例:URL編碼:姓名:張三 & 性別:男 & 民族:漢3。URL編碼的解碼可以根據編碼規則和環境變量,自己編寫解碼程序,也可直接使用現成的解碼程序。⑴使用解碼程序cgiparse制作CGI:cgiparse:這是處理GET方式和POST方式的很有用的程序,是CERN格式服務器程序的一部分,如果服務器為其它格式,請選用其它解碼程序。使用CGIPARSE程序時,需根據不同的表單式輸入采取相應的參數在CGI程序的開頭調用CGIPARSE程序。若使用GET命令發送表單輸入,則cgiparse程序使用form選項將參數名/參數值對進行解碼并存入與變量同名的Shell環境變量中,只是在名字前面加上form_前綴,即若變量原來為mybook,cgiparse產生的環境變量為FORM_mybook。在Bourne shell中程序調用cgiparse處理GET輸入格式為eval/home/www/cgi-bin/cgiparse-form,若使用POST命令地送表單輸入,可以有幾種途徑處理輸入。其中最簡單的方法是,使用_init選項,從標準輸入讀入輸入量,并把它存入環境變量QUERY_STRING中,然后選擇_form選項調用cgiparse對參數名/參數值對進行解碼,并存入環境變量中。因此在Shell程序中調用cgiparse處理POST輸入需兩行命令:eval/home/www/cgi-bin/cgiparse-initeval/home/www/cgi-bin/cgiparse-form例:#!/bin/sheval/home/www/cgi-bin/cgiparse-init --- 第一部分:|--碼,采用eval/home/www/cgi-bin/cgiparse-form --- cgiparse的POST方式echo"Conetnt-type:text/html" --- 程序第二部分:|-- 數據頭,echo --- 數據類型為文本格式html文檔,注意應有一空行echo"" --------echo"Sleepometer Results |" |echo"Results: |if [!-z "$FORM_the Name"]; 程序主體部分:then echo"$FORM_the Name is" 處理表單輸入else echo"A Person with no name is" 注意輸入數據fi 的格式if["$FORM_sheepy"="yes"]; |then echo"sleepy" |else echo"Not sleepy" |fi echo" --------⑵使用uncgi解碼程序設計CGI程序uncgi:用C語言寫成,處理方式與cgiparse類似,但比cgiparse易得到并能更好地處理POST方式的輸入,可從: / ml/得到有關信息。uncgi最好安裝在目錄cgi-bin中,編譯前應修改Makefile文件,使其中的目錄路徑和你使用的系統一致。uncgi程序從用GET或POST方式輸入數據中的表單中讀入輸入并解碼,然后產生一組變量,這些變量都加上了www_前綴,如:原來的特征變量為 the work和playing,現在則對應為 www_the work和www_playing,對于多個參數名/參數值對使用相同名字時,只產生一個環境變量,每個變量值用#符號分開,如:參數名/參數值對為playing=baskeball, playing=baseball,則環境變量FORM_PLAYING的值為baskeball#baseball。使用uncgi程序時,需對FORM標注中的ACTION特征量作一點修改,不能在ACT\ON中直接調用,必須附上程序名,如:需改為例:#!/bin/shcgi程序的數據頭部分:echo"Content=type:text/html" --- 使用uncgi|-- 解碼程序時,echo --- 不需要解碼部分,調用cgi時,自動調用uncgi進行解碼。echo"" ---------echo"Sleeppometer Results |" |echo"" |echo"Results:" |if [!-z"$www_the Name"]; cgi程序主體部分: then echo"$www_the Name is" 其中對兩個表單變量else echo"A person with no the Name和sleepy name is" 進行了處理fi | if ["$www_sleepu"="yes"]; |then echo"sleepy。" |else echo"Not sleepy。" |fi |echo"" ---------⑶使用 解碼設計CGI程序 用perl語言編寫,它從GET或POST讀入表格是輸入并存放在數組中。可從 軟件包,是由Steve Brener用perl編寫的,它可以從用GET或POST方式輸入的表單中讀入表單式輸入,并存放在一個perl表或相應的數組中,用戶可以從地址 用戶若要使用cgi-lib,則可以從上述URL中取出源程序,并把它放在用戶的perl目錄中,且在用戶程序中用命令veguire' '把庫目錄中的程序包含進程序中。 包含好幾個管理表單的程序,Read Parse是 軟件包中最重要的一個表單管理軟件。它能從用GET或POST輸入的表單中讀入輸入值,并把輸入值以參數名/參數值對的形式放入相應的perl數組中。Read Parse命令的調用格式為:& Read Parse(*數組名)對于多個參數名/參數值使用相同的名字時, 會將數組中的值用\0空字符)分開。例:#!/user/local/bin/perlcgi程序的第一部分:require‘ ’; --- 調用 軟件包|---中的Read Parse&lead Parse(*in); --- 程序進行解碼,結果放在數組in中cgi程序的數據頭部分:print"Content_type:text/html\n\n"; ---說明數據是文本格式的html文檔’,“\n\n”表示打印一個空行print“”; --------print“Sleeppometer Results |” ; |print“”; |print“Results:”; cgi程序 if [$in{‘the Name’}] 的主體部分: [ print“$in{the Name}is”;] 注意對表單輸 else{print“A Person with no 入變量的處理,name is”;} 變量存放在數if [$in{‘sleepy’}eq yes] 組in中 {print“sleepy。”} |else{print“not sleepy。”;} |print“”; --------4。 帶參數的CGI程序使CGI程序通用化是非常重要的,從前面檢查登錄CGI的程序可知,若要檢查不同人的登錄情況,則需編寫同樣的CGI程序,但對于同樣的情況,只需編寫一個帶參婁的CGI程序,如:只需將示例程序中的Ison:‘who I grep約翰’語句改為ison:‘who I grep“$第幾個變量”’即可。把參數賦給CGI程序,用如下方法連接:”clink hear。連接中問號后的 g3為將傳給cgi-bin/myscript的參數,它們用“+”分開。下面舉一個檢查珍妮是否登錄的例子:#!/bin/shecho“Covtent_type:text/html”echoecho“”echo“你登錄了嗎?”echo“”ison=“who I grep‘$2’”if[-z“$ ison”];the echo“珍妮已登錄。”else echo“珍妮未登錄。”fiecho“”用戶只需通過珍妮登錄了嗎?即可在瀏覽器中顯示珍妮是否登錄的界面。5。 NPH(無處理頭)程序NPH(non-processed headers)程序即非解釋文件頭程序,是為了加快服務器往瀏覽器傳文件的速度,編寫這種程序須按照以下格式:⑴程序中需有一個nph前綴,如nph_pinglanra。⑵程序除了原有的數據類型頭、地址頭及狀態頭外,還需加入HTTPD頭。HTTPD頭分為兩部分:① HTTP/1。0加上狀態碼,如:HTTP/1。0 2000k狀態碼200,表示“一切正常,數據已送走。”② 服務器頭,它能顯示出運行的服務器的版本號,如:Server: NCSA/1。3Server: CERN/3。0 PRE6。
熱心網友
我提供下列關于CGI的設計內容,希望能幫上你的忙……1。 定義:CGI(Common Gateway Interface)是HTTP服務器與你的或其它機器上的程序進行“交談”的一種工具,其程序須運行在網絡服務器上。2。 功能:絕大多數的CGI程序被用來解釋處理杰自表單的輸入信息,并在服務器產生相應的處理,或將相應的信息反饋給瀏覽器。CGI程序使網頁具有交互功能。3。 運行環境:CGI程序在UNIX操作系統上CERN或NCSA格式的服務器上運行。在其它操作系統(如:windows NT及windows95等)的服務器上也廣泛地使用CGI程序,同時它也適用于各種類型機器。4。 CGI處理步驟:⑴通過Internet把用戶請求送到服務器。⑵服務器接收用戶請求并交給CGI程序處理。⑶CGI程序把處理結果傳送給服務器。⑷服務器把結果送回到用戶。5。 CGI服務器配置:CGI程序不是放在服務器上就能順利運行,如果要想使其在服務器上順利的運行并準確的處理用戶的請求,則須對所使用的服務器進行必要的設置。配置:根據所使用的服務器類型以及它的設置把CGI程序放在某一特定的目錄中或使其帶有特定的擴展名。⑴CREN格式服務器的配置:編輯CREN格式服務器的配置文件通常為/etc/ nf/,在文件中加入:Exec cgi-bin/*/home/www/cgi-bin/*。exec。命令中出現的第一個參數cgi-bin/*指出了在URL中出現的目錄名字,并表示它出現在系統主機后的第一個目錄中,如: ⑵NCSA格式服務器的配置在NCSA格式服務器上有兩種方法進行設置:①在 nf文件(通常在conf目錄下)中加入:Script Alias/cgi-bin/cgi-bin/Script Alias命令指出某一目錄下的文件是可執行程序,且這個命令是用來執行這些程序的;此命令的兩個參數與CERN格式服務器中的Exec命令的參數的含意一樣。②在 nf文件加入:Add type application/ i此命令表示在服務器上增加了一種新的文件類型,其后第一個參數為CGI程序的MIME類型,第二個參數是文件的擴展名,表示以這一擴展名為擴展名的文件是CGI程序。在用上述方法之一設置服務器后,都得重新啟動服務器(除非HTTP服務器是用inetd啟動的)。6。 CGI的編寫語言CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變量。對初學者來說,最好選用易于歸檔和能有效表示大量數據結構的語言,例如UNIX環境中:· Perl (Practical Extraction and Reporting Language)· Bourne Shed或者Tcl (Tool Command Language)Windows環境中:· C和C++由于Internet上大部分服務器使用的是UNIX操作系統,且幾乎任一UNIX操作系統中都有Bourne Shell,因而后面講述的例子中大部分是用Bourne Shell編寫的。7。 CGI環境變量列表SERVER-NAME:運行CGI序為機器名或IP地址。SEUVER-INTERFACE:WWW服務器的類型,如:CERN型或NCSA型。SERVER-PROTOCOL:通信協議,應當是HTTP/1。0。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-NOST:發送程序的主機名,不能確定該值。REMOTE-ADDR:發送程序的機器的IP地址。REMOTE-USBR:發送程序的人名。CONTENT-TYPE:POST發送,一般為applioation/xwww-form-urlencoded。CONTENT-LENGTH:POST方法輸入的數據的字節數。1。CGI數據傳送方法:客戶有兩種方法:⑴通過環境變量,采用GET方式:…該法簡單,但用cethod=get方式通過變量傳送數據會因變量接受的數據量有限而產生數據丟失。⑵通過標準輸入,采用POST方式──建議使用方式標準輸入法是通過method=post方式把數據傳送到網關程序的入口。數據在傳輸中是經過URL編碼的,CGI程序在處理前需進行解碼,由于此法對數據量沒有限制,因而傳輸中不會產生數據丟失。2。輸入數據URL編碼URL編碼就是瀏覽器把表單輸入的數據傳送到服務器時,將輸入數據編碼、打包。從表單輸入的變量及其數值,被編碼為“參數名/參數值”,同時把那此不能直接傳輸的數據轉化為16進制。然后根據使用的是GET方法還是POST方法,把它作為URL的一部分或直接送到服務器。3。 CGI程序的特點CGI程序是一種在www服務器上運行的程序,主要用于處理用戶通過表單輸入的信息,在服務器上產生相應的作用,或把處理結果反饋給瀏覽器,CGI程序須符合以下兩個條件:⑴CGI程序的輸出要寫標準輸出這樣,服務器才能解釋這一輸出,并把它返回到瀏覽器。⑵CGI程序的數據頭要告訴服務器如何處理該程序的輸出為了使服務器能夠解釋CGI程序的輸出,CGI程序要有一個特殊的頭作為第一個輸出行,數據頭可以是下列三種之一:①數據類型(Content-type),如:Content-type: text/html② 地址類型(Location),如:Location://www。w3。0rg③狀態類型(Status), 如:Status:204 No Respouse4。CGI程序格式CGI程序同下列三部分構成:⑴數據解碼部分:由瀏覽器傳送給服務器的通過表單輸入的數據都是經過URL編碼的,必須進行解碼。如果不需要處理表單輸入,該部分可省略。⑵數據頭部分:必須包含這一部分作為第一個輸出行,該行后必須有一空格行。該行可以是下列三種之一:①數據類型(Content-type), 如:Content-type: text/html②地址類型(Location),如:Location:// ③狀態類型(Status), 如:Status:204 No Respouse⑶CGI程序主體部分:對通過表單輸入的數據進行處理,并輸出到標準輸出。5。CGI程序的數據類型:若服務器要把數據傳送給瀏覽器,則須在CGI程序中使用表示數據類型的頭,它將告訴瀏覽器如何解釋該輸入。例1:如服務器要判斷回一個HTML文件,則CGI程序中的類型頭應定義為:Content-type:text/html例2:如服務器要送回的文件類型是JEPG文件,則CGI程序中的類型頭應定義為:Contert-type:image/jpg其余的數據以此類推。6。CGI程序的地址類型若用戶想在服務器上打開或加載一個現有的文件,則須在CGI程序中使用表示地址類型的頭。表示地址類型的頭的值可以是一個URL全地址,也可以是去掉http:和主機名的URL地址。例1:Location: 例2:Location: 例3:Location: Book/ ml7。CGI程序的狀態類型如果在傳送最后服務器還要送一個特殊的狀態碼到瀏覽器,則須在CGI程序中加入表示狀態類型的頭。狀態碼由HTTP定義。例:Status: 204 No Response此狀態碼表示這時瀏覽器不能從服務器得到任何反饋信息,即服務器上的CGI程序只是對輸入進行處理而不作應答,瀏覽器界面保持不變。8。CGI程序示例下面是一個檢索約翰是否登錄的例子:#!/bin/sh 數據頭部分,聲明數據格式echo"Content-type:text/html" 為文本格式echo 此處省略了解碼部分echo""echo"約翰登錄了嗎?"echo""ison='who I grep lemay' 查詢登錄信自己 ,if[-z"Sison:]; 并向標準輸出設備then echo"約翰登錄"。 輸出查詢到的信息。elso echo"約翰未登錄"。fiecho""1。 處理表單的CGI程序表單允許用戶輸入各種信息,而通常CGI程序和帶參數的CGI程序不能處理客戶的輸入或只能處理帶硬編碼參數的程序。因此出現了專門處理表單的程序。處理表單的CGI程序的編寫須注意那些與表單有關的因素。編寫一般步驟為:⑴由于表單傳給CGI程序的數據是經URL編碼的,因而編寫前需調用cgiparse、uncgi或 程序對輸入進行解碼。⑵輸出標準數據類型標題,地址類型標題或狀態類型標題,這些標題后要以兩個\n(換行)字符結尾。第一個\n表示換行,第二個\n表示標題后面的空行。⑶輸出對應版面開頭部分的HTML程序。2。URL編碼規則URL編碼就是由瀏覽器把通過表單輸入的數據──變量/變量值轉化為參數/參數值,同時把那些不能直接傳輸的符號,如:&,%,+轉化為16進制。編碼規則:參數/參數值對之間用“&”分隔,空格用“+”代替參數與參數值之間用“=”分隔,如果參數未賦值,參數也同樣出現在編碼中,如:“姓名=”。一些特殊符號:&,%,+轉化為帶%的16進制數:%NN。例:URL編碼:姓名:張三 & 性別:男 & 民族:漢3。URL編碼的解碼可以根據編碼規則和環境變量,自己編寫解碼程序,也可直接使用現成的解碼程序。⑴使用解碼程序cgiparse制作CGI:cgiparse:這是處理GET方式和POST方式的很有用的程序,是CERN格式服務器程序的一部分,如果服務器為其它格式,請選用其它解碼程序。使用CGIPARSE程序時,需根據不同的表單式輸入采取相應的參數在CGI程序的開頭調用CGIPARSE程序。若使用GET命令發送表單輸入,則cgiparse程序使用form選項將參數名/參數值對進行解碼并存入與變量同名的Shell環境變量中,只是在名字前面加上form_前綴,即若變量原來為mybook,cgiparse產生的環境變量為FORM_mybook。在Bourne shell中程序調用cgiparse處理GET輸入格式為eval/home/www/cgi-bin/cgiparse-form,若使用POST命令地送表單輸入,可以有幾種途徑處理輸入。其中最簡單的方法是,使用_init選項,從標準輸入讀入輸入量,并把它存入環境變量QUERY_STRING中,然后選擇_form選項調用cgiparse對參數名/參數值對進行解碼,并存入環境變量中。因此在Shell程序中調用cgiparse處理POST輸入需兩行命令:eval/home/www/cgi-bin/cgiparse-initeval/home/www/cgi-bin/cgiparse-form例:#!/bin/sheval/home/www/cgi-bin/cgiparse-init --- 第一部分:|--碼,采用eval/home/www/cgi-bin/cgiparse-form --- cgiparse的POST方式echo"Conetnt-type:text/html" --- 程序第二部分:|-- 數據頭,echo --- 數據類型為文本格式html文檔,注意應有一空行echo"" --------echo"Sleepometer Results |" |echo"Results: |if [!-z "$FORM_the Name"]; 程序主體部分:then echo"$FORM_the Name is" 處理表單輸入else echo"A Person with no name is" 注意輸入數據fi 的格式if["$FORM_sheepy"="yes"]; |then echo"sleepy" |else echo"Not sleepy" |fi echo" --------⑵使用uncgi解碼程序設計CGI程序uncgi:用C語言寫成,處理方式與cgiparse類似,但比cgiparse易得到并能更好地處理POST方式的輸入,可從: / ml/得到有關信息。uncgi最好安裝在目錄cgi-bin中,編譯前應修改Makefile文件,使其中的目錄路徑和你使用的系統一致。uncgi程序從用GET或POST方式輸入數據中的表單中讀入輸入并解碼,然后產生一組變量,這些變量都加上了www_前綴,如:原來的特征變量為 the work和playing,現在則對應為 www_the work和www_playing,對于多個參數名/參數值對使用相同名字時,只產生一個環境變量,每個變量值用#符號分開,如:參數名/參數值對為playing=baskeball, playing=baseball,則環境變量FORM_PLAYING的值為baskeball#baseball。使用uncgi程序時,需對FORM標注中的ACTION特征量作一點修改,不能在ACT\ON中直接調用,必須附上程序名,如:需改為例:#!/bin/shcgi程序的數據頭部分:echo"Content=type:text/html" --- 使用uncgi|-- 解碼程序時,echo --- 不需要解碼部分,調用cgi時,自動調用uncgi進行解碼。echo"" ---------echo"Sleeppometer Results |" |echo"" |echo"Results:" |if [!-z"$www_the Name"]; cgi程序主體部分: then echo"$www_the Name is" 其中對兩個表單變量else echo"A person with no the Name和sleepy name is" 進行了處理fi | if ["$www_sleepu"="yes"]; |then echo"sleepy。" |else echo"Not sleepy。" |fi |echo"" ---------⑶使用 解碼設計CGI程序 用perl語言編寫,它從GET或POST讀入表格是輸入并存放在數組中。可從 軟件包,是由Steve Brener用perl編寫的,它可以從用GET或POST方式輸入的表單中讀入表單式輸入,并存放在一個perl表或相應的數組中,用戶可以從地址 用戶若要使用cgi-lib,則可以從上述URL中取出源程序,并把它放在用戶的perl目錄中,且在用戶程序中用命令veguire' '把庫目錄中的程序包含進程序中。 包含好幾個管理表單的程序,Read Parse是 軟件包中最重要的一個表單管理軟件。它能從用GET或POST輸入的表單中讀入輸入值,并把輸入值以參數名/參數值對的形式放入相應的perl數組中。Read Parse命令的調用格式為:& Read Parse(*數組名)對于多個參數名/參數值使用相同的名字時, 會將數組中的值用\0空字符)分開。例:#!/user/local/bin/perlcgi程序的第一部分:require‘ ’; --- 調用 軟件包|---中的Read Parse&lead Parse(*in); --- 程序進行解碼,結果放在數組in中cgi程序的數據頭部分:print"Content_type:text/html\n\n"; ---說明數據是文本格式的html文檔’,“\n\n”表示打印一個空行print“”; --------print“Sleeppometer Results |” ; |print“”; |print“Results:”; cgi程序 if [$in{‘the Name’}] 的主體部分: [ print“$in{the Name}is”;] 注意對表單輸 else{print“A Person with no 入變量的處理,name is”;} 變量存放在數if [$in{‘sleepy’}eq yes] 組in中 {print“sleepy。”} |else{print“not sleepy。”;} |print“”; --------4。 帶參數的CGI程序使CGI程序通用化是非常重要的,從前面檢查登錄CGI的程序可知,若要檢查不同人的登錄情況,則需編寫同樣的CGI程序,但對于同樣的情況,只需編寫一個帶參婁的CGI程序,如:只需將示例程序中的Ison:‘who I grep約翰’語句改為ison:‘who I grep“$第幾個變量”’即可。把參數賦給CGI程序,用如下方法連接:”clink hear。連接中問號后的 g3為將傳給cgi-bin/myscript的參數,它們用“+”分開。下面舉一個檢查珍妮是否登錄的例子:#!/bin/shecho“Covtent_type:text/html”echoecho“”echo“你登錄了嗎?”echo“”ison=“who I grep‘$2’”if[-z“$ ison”];the echo“珍妮已登錄。”else echo“珍妮未登錄。”fiecho“”用戶只需通過珍妮登錄了嗎?即可在瀏覽器中顯示珍妮是否登錄的界面。5。 NPH(無處理頭)程序NPH(non-processed headers)程序即非解釋文件頭程序,是為了加快服務器往瀏覽器傳文件的速度,編寫這種程序須按照以下格式:⑴程序中需有一個nph前綴,如nph_pinglanra。⑵程序除了原有的數據類型頭、地址頭及狀態頭外,還需加入HTTPD頭。HTTPD頭分為兩部分:① HTTP/1。0加上狀態碼,如:HTTP/1。0 2000k狀態碼200,表示“一切正常,數據已送走。”② 服務器頭,它能顯示出運行的服務器的版本號,如:Server: NCSA/1。3Server: CERN/3。0 PRE6。