Format |
Content-Type |
HTML | text/html |
Text | text/plain |
GIF | image/gif |
JPEG | image/jpeg |
PostScript | application/postscript |
MPEG | video/mpeg |
圖4. 腳本的結(jié)果
這是個(gè)很簡(jiǎn)單的例子, 他能這樣備調(diào)用:
A >Is Laura Logged in?/A>這是沒有輸入的腳本,它只運(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)在你通過從命令行運(yùn)行他,測(cè)試一下,你將得到一個(gè)結(jié)果說我未登陸你的系統(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文件。
這個(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>"
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)樵缙谒迷谒阉鞴δ苤?
我們?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頁中的連接吧!原來是這樣:
A >Is Laura Logged in?/A>修改為通用查詢功能后是這樣,比如查詢名字叫john的人是否登陸:
A >Is John Logged in?/A>在你的服務(wù)器上試試,看是否有結(jié)果。
看下面一個(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)容中使用這些信息.
比如說, 讓我們假設(shè)你在多頁上已有多個(gè)連接到同一個(gè)腳本. 你能用這個(gè)路徑信息顯示那個(gè)有連接的HTML文件名. 這樣, 在你完成處理你的腳本之后, 當(dāng)你發(fā)回一個(gè)HTML文件時(shí), 你能在這個(gè)文件里包含一個(gè)連接,發(fā)回用戶一開始那個(gè)頁。
你會(huì)在下一章節(jié)學(xué)到更多路徑信息:有用的表單和腳本. 待后來登出
不用怕, 這里開始解釋這些情況.
Location: ../docs/final.html這個(gè)Location行用作通常的輸出位置,也就是說,如果你用了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
很幸運(yùn), 這一切很容易. 你只要輸出下面這個(gè)命令即可(后面跟一個(gè)空行):
echo Status: 204 No Response echo這個(gè)Status頭部提供狀態(tài)碼給服務(wù)器(并且也給瀏覽器). 特別的204將傳遞給瀏覽器,如果能識(shí)別它,它將什么也不做.
記住, 大多數(shù)表單有兩個(gè)部分: HTML的表單格式;處理表單數(shù)據(jù)的CGI腳本. 這個(gè)CGI腳本使用標(biāo)簽FORM>屬性調(diào)用的.
這個(gè)ACTION屬性包含著處理表單的腳本:
FORM ACTION="http://www.popchina.com/cgi-bin/processorscript">在這個(gè)表單中, 每個(gè)輸入?yún)^(qū)都有一個(gè)NAME的屬性, 用來稱呼表單元素. 當(dāng)這個(gè)表單數(shù)據(jù)被遞交給你在ACTION中定義的CGI腳本, 這樣這些name和輸入內(nèi)容被作為一個(gè)數(shù)字或字符傳遞給腳本.
我們上面談?wù)摰姆椒ǎ瑢?shí)際是GET,它將數(shù)據(jù)打包放置在環(huán)境變量QUERY_STRING中作為URL整體的一部分傳遞給服務(wù)器。
POST做很多類似GET同樣的事情, 不同的地方就是它是分離地傳遞數(shù)據(jù)給腳本. 你的腳本通過標(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ǔ)量是有限的. 換句話說,如果你有很多數(shù)據(jù)但是你又用GET,你會(huì)丟失很多數(shù)據(jù).
如果你用POST, 你可以盡可能多地使用數(shù)據(jù), 因?yàn)檫@些數(shù)據(jù)從來也不分配到一個(gè)變量里.
theName=Ichabod+Cranegender=malestatus=missingheadless=yesURL編碼遵循下列規(guī)則:
這里介紹一個(gè)叫uncgi的解碼程序, 你可以從http://www.hyperion.com/~koreth/uncgi.html. 得到原碼,安裝在你自己的cgi-bin目錄下.
圖5. 告訴我你的名字的表單.
這個(gè)輸入被發(fā)給腳本, 然后發(fā)回顯示一個(gè)hello的信息(間圖.6).
如果你在姓名輸入處不輸入任何東東,會(huì)怎樣?見圖7.
圖6. 姓名表單的結(jié)果.
圖7. 另一個(gè)結(jié)果.
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è)例子中, 我們已經(jīng)使用uncgi解碼輸入數(shù)據(jù), 實(shí)際這個(gè)表單已經(jīng)為你做好解碼. 通過建立一個(gè)uncgi的目錄,一旦表單遞交給服務(wù)器,服務(wù)器會(huì)自動(dòng)進(jìn)行解碼,這樣,所有的name/value已經(jīng)準(zhǔn)備就緒等待你的使用.
現(xiàn)在,一個(gè)例子開始部分假設(shè)是下面這樣:
echo Content-type: text/html echo echo "HTML>HEAD>" echo "TITLE>Hello/TITLE>" echo "/HEAD>BODY>" echo "P>"接下來,有兩種情況要處理:一件是處理用戶不輸入名字的情況,一個(gè)是如果輸入了向他們說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" . 用來返回:
echo "/P>P>A HREF="../lemay/name1.html">Go Back/A>/P>" echo "/BODY>/HTML>"
你正確配置了你的服務(wù)器運(yùn)行CGI腳本? 你的腳本是放置在cgi-bin目錄中嗎?如果你的服務(wù)器允許帶.cgi擴(kuò)展名的CGI運(yùn)行, 你的腳本文件名的擴(kuò)展名是這樣嗎?
解答還是如上一條一樣,然后你用命令行執(zhí)行你的CGI,可以正常運(yùn)行嗎?是否有錯(cuò)誤?.
確定你的頭部行和數(shù)據(jù)部之間有一空行.
確定你的腳本是可執(zhí)行的(在UNIX, 用chmod +x 你的腳本.cgi). 在從瀏覽器運(yùn)行之前,你應(yīng)當(dāng)從命令行運(yùn)行你的腳本,如果客戶端是win95,可以用telnet登陸你的服務(wù)器,執(zhí)行命令行,當(dāng)然必須了解UNIX命令.
環(huán)境變量 |
意義 |
SERVER_NAME | CGI腳本運(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_METHOD | POST 或 GET, 取決于你的表單是怎樣遞交的. |
HTTP_ACCEPT | 瀏覽器能直接接收的Content-types, 可以有HTTP Accept header定義. |
HTTP_USER_AGENT | 遞交表單的瀏覽器的名稱、版本 和其他平臺(tái)性的附加信息。 |
HTTP_REFERER | 遞交表單的文本的 URL,不是所有的瀏覽器都發(fā)出這個(gè)信息,不要依賴它 |
PATH_INFO | 附加的路徑信息, 由瀏覽器通過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中問號(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ù). |
當(dāng)然也有表單上載時(shí)可以解碼的程序,很少。
為了使用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è)名字. 這樣可以正常處理你的腳本.
cgi-lib.pl 后來版本可以很好支持, 在http://www.bio.cam.ac.uk/cgi-lib/ 了解更多的情況.
另一個(gè)處理用Perl編寫的CGI地址是 http://valine.ncsa.uiuc.edu/cgi_docs.html .
注意:上述程序可以用ultra edit來編輯,注意轉(zhuǎn)換UNIX格式 ,必須采用UNIX格式存盤,再上載,用telnet登陸,在命令行鍵入perl sample.pl,看有無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è)古老的通用留言簿,大家可以拿去做自己的留言簿。這里下載
標(biāo)簽:宜春 石嘴山 松原 鄂州 淄博 六安 自貢 河北
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《不錯(cuò)的一篇學(xué)習(xí)CGI腳本(腳本)》,本文關(guān)鍵詞 不,錯(cuò)的,一篇,學(xué)習(xí),CGI,腳本,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。下一篇:詳細(xì)說明什么是Perl