第一章:基礎的基礎CGI/PERL學習
1.1 為什麼使用CGI?
我沒有把什麼是CGI放在基礎篇的第一段,是因為實在很難說明白到底什麼是CGI.
而如果你先知道CGI有什麼作用,將會很好的理解CGI是什麼這個概念。 CGI可以為我們
提供許多HTML無法做到的功能。比如a.一個記數器; b.顧客信息表格的提交以及統計;
c.搜索程序;d.WEB數據庫等等。
用Html是沒有辦法記住客戶的任何信息的,就算用戶願意讓你知道。用Html也是無法
把信息記錄到某一個特定文件裡的。要把客戶段的信息記錄在服務器的硬盤上,就要用到
CGI. 這是CGI最重要的作用,它補充了Html的不足。是的,僅僅是補充,不是替代。
1.2 CGI是什麼?
好了,現在我們來說到底什麼是CGI.Common Gate Intergace聽起來讓人有些專業,
我們就管它叫CGI好了。在物理上,CGI是一段程序,它運行在Server上,提供同客戶段
Html頁面的接口。這樣說大概還不好理解。那麼我們看一個實際例子: 現在的個人主頁
上大部分都有一個留言本。留言本的工作是這樣的:先由用戶在客戶段輸入一些信息,
如名字之類的東西。接著用戶按一下「留言」(到目前為止工作都在客戶端),瀏覽器把
這些信息傳送到服務器的cgi目錄下特定的cgi程序中,於是cgi程序在服務器上按照預定
的方法進行處理。在本例中就是把用戶提交的信息存入指定的文件中。然後cgi程序給客
戶端發送一個信息,表示請求的任務已經結束。此時用戶在瀏覽器裡將看到「留言結束」
的字樣。整個過程結束。
1.3 選擇你熟悉的編程語言
既然CGI是一種程序,自然需要用編程語言來寫。你可以用任何一種你熟悉的高級語言,
C,C++,C shell和VB.值得特別指出的,有一種叫Perl的語言。其前身是屬於Unix專用的
高級語言,其具有強大的字符串處理能力而成為現在寫CGI,特別是表單類程序的首選。最
近它已經有了Window95,和winnt版本。你可以在搜索程序裡找到在那裡下載它。 VB是Ms
的殺手鑭,從目前的情況看,微軟公司正試圖使VB無所不能。自然也包括在Internet 請各
位注意,VB開發的程序只能在windows平台上被執行,所以它有一定局限。 C Shell,經典
的語言。可惜能做的事情不多,而且必須在Unix平台下。 C,C++,正真的無所不能。可是
在寫CGI的時候顯得非常難以掌握。特別是缺乏可以靈活使用的字符串處理函數。對程序員
的要求也比較高,維護複雜。 最後要提醒各位,因為CGI是Server和Clinet的接口,所以
對於不同的Server,CGI程序的移值是一個很複雜的問題。一般對於不同的Server,決沒有
兩個可以互相通用的CGI.實際上 這就是CGI程序最複雜的地方。
1.4 安全
我想各位敏感的朋友又要問我關於安全性能的問題了。實際上CGI是比較安全的,至少
比那些沒有數字簽名的ActiveX控件要安全的多。除非你有意在程序裡加入了破壞Server的
命令, 否則一般不會有什麼嚴重的後果。而個人網站不向大眾開放CGI目錄,則因為怕各位
學習不精,無端增加服務器的負擔,所以一般不提供。
小結:本章講述了CGI基本概念,也說明了各種編程語言的優缺點,同時解釋了為什麼個人
網站不提供CGI的原因。接下來我們開始正式學習。
第二章 Html的表單基礎知識
組成Cgi程序的是兩部分,一部分是html頁面,就是用戶看到的東西。另一部分則是運
行在服務器上的程序。一般來說,我們先寫html頁面,再寫程序。所以我們的學習頁是這樣,
先看看表單的寫法,再去學習CGI程序。
對於html的表單,有比較複雜和詳細的規定。但由於它們是屬於html標準裡的東西,所
以我不打算詳細講解。最好是你自己找本書看看。
Html表單
<Form></Form>標記把輸入域組合起來,並且說明了表單提交的方式和地點。Form標籤有許
多屬性,比如NAME等等。具體的屬性,將在使用的時候說明。
在FORM裡還有許多不同的標籤,正是它們組成了表單的各種成分。
<INPUT [TYPE=TEXT] NAME="TEXT-ID" [SIZE=NN] [MAXLENGTH=NN]
[VALUE='DEFAULT TEXT']>
該語句在HTML裡產生一個文本標籤,[]裡表示該屬性是可選的。
<INPUT TYPE=SUBMIT [NAME='BUTTON-ID'][VALUE="BUTTON LABLE TEXT"]>
該語句產生一個提交按鍵,用於表單的提交。它提供一個發送表單的按紐,信息發向<FORM>
標記裡ACTION屬性裡給出的URL.根據表單方法(METHOD)指定的HTTP請求類型 提交信息。
在以後我將詳細講解。
<INPUT TYPE=RESET[VALUE='BUTTON LABEL TEXT']>
具有TYPE=RESET屬性的INPUT將產生一個按鈕,它能重置表單各個域 的內容到初始狀態。
<INPUT TYPE=RADIO NAME="RADIO-SET -ID" vALUE="CHOICE-ID" [CHECKED]>
表單可以用此標記提示用戶從幾個選擇項裡作出選擇。麼個選擇項目都是一個單選按鈕它們
具有相同的NAME值。在任何時候只要有一個被選中。此標記有一個VALUE屬性,如果它被選
中,則發送表單時將以"RADIO-SET-ID=CHOICE-ID"的形式發送。
<INPUT TYPE=CHECKBOX NAME='BOX-SET-ID' VALUE='CHOICE-ID' [CHECKED]>
此標籤將產生一個'OFF'或'ON'的開關。它同RADIO相似,但是可以多選。當提交表單的時候如
果一個復選框是選中的餓,那麼它的VALUE屬性作為BOX-SET-ID表單數據的值被提交。幾個
擁有同樣NAME屬性的復選框為一組。它們用','分開的列表。
第三章:傳送方式 CGI/PERL學習
傳送方法:
所謂方法是指調用CGI程序的途徑。事實上,要執行程序時,你用一種方法向服務器提
出請求,此請求定義了程序如何接受數據。 下面介紹最常用的兩種方法:get和post
1.GET 當使用這種方法時,CGI程序從環境變量QUERY_STRING獲取數據。QUERY_STRING被
稱為環境變量,就是這種環境變量把客戶端的數據傳給服務器。為了解釋和執行程序,CGI
必須要分析(處理)此字符串。當你想從服務器獲得數據並且不改變服務器上的數據時,
你應該選用GET.但如果你的字符串長度超過了一定長度,那麼還是選用POST方法。
2.POST 使用POST方法時,WEB服務器通過stdin(標準輸入),向CGI程序傳送數據。服務
器在數據的最後沒有使用EOF字符標記,因此程序為了正確的讀取stdin,必須使用
CONTENT_LENGTH .當你發送的數據將改變Web服務器端的數據或者你想給CGI程序傳送的數
據超過了1024 字節,這是url的極限長度,你應該使用post方法。
3.實現方法:
上次講過html中的<Form>標籤,對於傳送數據方法的定義也在這個標籤裡定義。 如下:
<form name="guyi's form" action=http://www.yourname.com/cgi/your.cgi method=GET>
定義了一個以get方法傳送數據的form,它的服務端程序訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
同樣的如下的定義將使用post方法。
<form method=post>
第四章:基本調試環境的建立
基本調試環境的建立:
我想不是每個閱讀教程的朋友有機會接觸到服務器之類的東西的。所以在接下去的閱
讀過程中沒有調試環境的朋友將會非常吃力。為了解決這個問題,我特別介紹一種在
win95或nt上建立WEB SITE的方法,以便各位能很好的閱讀程序。不過本方法內使用的軟
件都比較大,如果你不是一個真正的網絡發燒友,或許你會放棄這個教程。這個我也沒
有辦法,要知道喜歡一樣東西總是要付出代價的。
1.win95&winnt的Server軟件:
首先我要各位弄清楚一個概念,所謂Sever只是指在一台電腦上安裝了一個特別的軟件。
該軟件可以提供internet web site服務。這台電腦不一定要是什麼特別好的機器,只要它
能夠很好的運行Server軟件就可以了。比如我們的個人電腦就可以承擔這個任務。 在
Windows95下運行的server軟件不是很多,而且是屬於「業餘」的。就是說離真正的商業使
用有很大的距離。這主要是windows95平台的局限,比如很差的安全性,不穩定的內存分配
系統,混亂的文件系統以及最差的進程管理。不過這些不影響我們使用CGI程序,特別是一
個人調試自己的程序,而不是放在internet給數萬個人訪問。其代表是MS在windows OSR離
提供的pws(person web server)。你可以通過控制面版——>網絡——>服務——>Ms——>個人WEB服
務器安裝它。不過我希望你們最好還是不要使用這個東西,因為它對我們下面的課程沒有什
麼幫助。我曾試驗過用它來和我的perl程序相連,但很顯然不支持perl.雖然有消息說修改
註冊表可以解決這個問題,但我到現在還是沒有找到方法。相對而言,Windows NT因為其定
位的不同而可以提供較理想的操作平台。而且NT自帶有IIS(Internet Information Server)。
不過是2.0版的,如果你有IIS3.0就更好了。到本文寫成的時候,IIS已經有了4.0版本。當
然我相信不是所有人會去下載這個東西,因為有 104M.
上面講了這麼多,實際上我要給各位推薦的是WebSite for win95&NT.就是說兩個操作
系統都可以使用它。現在的版本是2.1,有17M.顯然是一個很大的軟件,不過正如我說的,
喜歡一樣東西是有代價的。你可以訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。 裡找到這個程序。 WebSite
支持winCGI,也支持perl寫的CGI程序。顯然這是一個好東西,可以滿足我們的要求。雖然
大了些,不過要是你能找到website 1.1的話也不錯,它大概有4M左右。不過我在網上從沒
發現有下載的地方。
2.Perl for win32
Perl,讓人激動的名字。我想再也找不到一個編程語言可以如此出色的完成基本CGI程序
的開發了。我感謝那些為perl移植做出貢獻的朋友們,是他們讓我們可以在win平台上使用如
此如此強大的Unix工具。 你可以在perl的主頁上找到perl for win32版本,當前版本是5.02.
你也可以在 訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。 裡找到perl for win32版本。大概是2.5M.
3.VB
VB是我們寫WinCGI程序最好的選擇。我推薦各位使用vb4.不是因為vb5不好,只是在
Internet上支持它的文檔和免費代碼太少了。
4.C&C++
這個教程裡幾乎沒有用C&C++寫的代碼,因為它更適合高級程序員而不是我們這些業餘
選手。不過你要是一定使用它我也沒有意見。
5.安裝。
好了,我們開始建立基本環境。就是說我們要在自己的機器上建立一個WEB SITE! 首
先安裝Website.按照它標準的安裝界面,你可以輕鬆的完成這個工作。缺省情況下它將
被安裝到c:website下。我提醒各位注意這幾個目錄:
cgi-shl:這個是基本的cgi目錄,也就是各位朝思暮想的地方!
cgi-win:這個cgi目錄裡放的是WinCgi程序。 其他的各位自己研究吧。
好了,在裝完Website後請確認它已經運行。在狀態攔地右下角會有一個齒輪地圖標,
它表示website正在運行。接下去請打開你地瀏覽器,在url輸入你機器的ip地址,如果沒
有 ip,請輸入:127.0.0.1.注意,做這些動作的時候,最好請你使用netscape,而且你
不必連上網絡! 如果一切順利的話,你將看到website的標記,那證明你已經成功了!
接下去我們安裝perl. 下載後的perl是一個自解開文件,它會問你安裝到哪個目錄。缺省
是c:perl,接著它展開並產生幾個自目錄。在安裝結束的時候,它會修改autoexec.bat,
把c:perlbin加如 path,請一定要這麼做,道理我會在下面解釋。最後請隨便寫一個以
。cgi或。pl結尾的文本文件。直接雙擊它,並為它加上關聯。。pl或 .cgi的關聯文件是
c:perlbinperl.exe.這步很重要,不然你無法完成接下去的學習。 那麼為什麼我們
要加路徑呢?因為perl是一種文本解釋型語言,就是說它沒有編譯的過程, 只有在運行
的時候解釋。解釋一句運行一句。所以我們必須讓系統知道perl.exe在哪裡。
6.測試
最後我們進行一個測試。請把下面的兩個程序下載並運行它們:
1.html文件:這是測試程序的客戶端內容,請以test.htm保存它。並把它放在
c:websitehotdocs 下,那是你的website缺省的根目錄。
test.htm:
<html> <title>你的第一個perl測試程序</title> <body> <h1>你的第一個perl測試程序<h1><br> <h2>win 平台的環境變量測試</h2><br> <form method="get" acton="http://127.0.0.1/cgi-shl/env.pl "> <input type=submit value="查看CGI環境變量"> </form> </body> </html>
2.Perl文件:請使用任意一個文本編輯器,輸入後以env.pl保存到c:websitecgi-shl下。
#! perl
print"Content-type:text/htmlnn";print"<title>Windows環境變量</title>";print"<body>恭喜你的website已經成功<br>";foreach $key(sort keys %ENV){ print"$key=$ENV{$key}<br>"; } PRINT"</BODY>";
在完成上面的工作後,請打開瀏覽器,輸訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。當然如果你的
機器是以tcp/ip方式 連在局域網上,請把127.0.0.1改成你的ip地址(還有test.htm裡的。)
然後按下那個鍵,當你的瀏覽器去向另一個 頁面的時候,今天的任務就算是完成了。
第五章:第一個程序--環境變量
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
服務器與CGI程序交換信息的協作方式是通過環境變量實現的。無論什麼請求,CGI程序總能在特定位置找到某些信息。無論環境變量怎樣定義,總有一些變量有著特定含義。環境變量是一個保存用戶信息的內存區。例如,所有的機器都有一個PATH環境變量,當在當前目錄找布道文件時就要查找PATH變量。當服務器收到一個請求後,它首先要收集它能得到的所有相關信息,並把它放入內存。那麼,服務器要收集什麼信息呢?
關於服務器自身的詳細信息
關於用戶的信息信息
關於用戶請求的信息
服務器不知道CGI程序到底需要那些信息,所以它把這些信息一起收集,那麼如果有什麼重要的東西就不會遺漏了。為了向你展示服務器收集那些環境變量,在上一期的教程裡我已經為各位寫了一個程序,該程序將幾乎所有的信息都反映在了瀏覽器裡。所以在進一步學習變量的時候,請首先把程序調試好。
環境變量
1.與服務器相關的環境變量
GATEWAY_INTERFACE | 服務器遵守的CGI版本 |
SERVER_NAME | 服務器的IP或名字 |
SERVER_PORT | 主機的端口號 |
SERVER_SOFTWARE | 服務器軟件的名字 |
2.與客戶機相關的環境變量
服務器瞭解你的CGI程序,但它一定不知道你的客戶機環境。正因為如此,同客戶機有
關的變量才是最重要的。因為它涉及到你的瀏覽器等等。
ACCEPT | 例出能被次請求接受的應答方式 |
ACCEPT_ENCODING | 列出客戶機支持的編碼方式 |
ACCEPT_LANGUAGE | 表明客戶機可接受語言的ISO代碼 |
AUTORIZATION | 表明被證實了的用戶 |
FORM | 列出客戶機的EMAIL地址 |
IF_MODIFIED_SINGCE | 當用get方式請求並且只有當文檔比指定日期更早時才返回數據 |
PRAGMA | 設定將來要用到的服務器代理 |
REFFERER | 指出連接到當前文檔的文檔的URL |
USER_AGENT | 標明客戶使用的軟件 |
3.與請求相關的環境變量
每次服務器受到的請求都不可能是一樣的。這意味著有許多CGI程序必須注意的信息。這些與請求相關的信息包含有用戶調用的信息,用戶如何發送請求,以及作為請求的一部分傳送了多少(什麼)信息。這些對你的程序來說是非常重要的,因此我們將化些時間詳細地討論一下其中的一些變量。特別是下面寫出的三個變量。這三個變量相當重要。
REQUEST_METHOD
QUERY_STRING
CONTENT_LENGTH
你必須熟悉這三個變量,因為它們用來表示數據是如何送到CGI程序的;然後你所要要做的事情就是在這三個變量裡取出數據,進行下一步的編程。其他的一些變量的用處很多,
你可以瞭解你的競爭對手正在調用你的程序,你可以辨別用戶是否註冊,或者你可以設置連接到你的CGI程序以便要求附加路徑信息包含在請求之中——因此你不必猜測你的用戶正在你的服務器的哪個頁面上。
AUTH_TYPE | 服務器用的確認模式 |
CONTENT_FILE | 含有CGI程序的數據文件 |
CONTENT_LENGTH | POST請求中向標準輸入(STDIN)發送的字節數 |
CONTENT_TYPE | 被發送數據的類型 |
PATH_INFO | CGI程序的附加路徑 |
PATH_TRANSLATED | PATH_INFO對應的絕對路徑 |
QUERY_STRING | 傳送給CGI程序的URL的問號(?)之後的那一部分 |
REMOTE_ADDR | 最終用戶的IP或主機名 |
REMOTE_USER | 如果用戶合法,則是用戶的組名 |
REQUEST_LINE | 發送給服務器的完整URL請求 |
REQUEST_METHOD | 作為HTTP的一部分請求而傳送數據的方法,比如get。 |
SCRPT_NAME | 運行的腳本名字 |
[
本帖最後由 蔡逸竹 於 2006-11-30 23:48 編輯 ]