Return Homepage Cooltang's Box
Homepage Article Title CGI教室
Catalog Original URL http://64.233.167.104/search?q=cache:gngFq3lBxicJ:www.socialwork.com.hk/cgi/cgiteach.htm+HTTP_PRAGMA+%E7%9A%84&hl=en
Backup Time 2004-5-25 6:00:59
Executor IP 196.30.3.250

CGI教室

[ 首頁 ] [ 上一層 ]

 















































    1. 一些設計 CGI 程式必備的知識 CGI Basic Knowledge

    學CGI程式必需知道事情

    選擇你慣用程式語言(當然必需是 CGI程式可使用電腦程式語言)、作業平台環境(例如: 網路上最常見UNIX、甚至WIN NT),在此之前你還需有HTML(超文字標記語言: 是種以標籤方式使用語言,但他不是個程式語言。)基礎知識,
    最簡單且最省錢方式是在自已電腦上架設網頁伺服器軟體不需連接上網路即可寫作網頁或CGI。
    至於架設網頁伺服器軟體在本網頁寫CGI相關工具軟體下載章節裡會提供給大家參考、下載使用。
    如果您不需考慮ISP連線上網路費用的話也可以申請一些像 http://www.prohosting.com/ 讓人免費使用CGI執行權網頁。

    2. 什麼是共同閘道介面? Common Gateway Interface

    共同閘道介面 Common Gateway Interface

    CGI 是 Common Gateway Interface 簡稱,一般中譯為:共通閘道介面。
    Common 是指共通、不限於一種作法意思,在這裡指的是語言獨立性,換言之,可以用任何一種程式語言來實作。
    Gateway 是說伺服器應用能力是經由擴充得到,它將查詢等要求交由外部程式處理,處理完了之後,再將結果傳回。
    Interface 是指一種介面意思,符合此一介面標準,便可以輕鬆地製作外部程式,而無需去擔心或處理低階問題。
    由於網際網路上 WEB 伺服器 (我們稱為 Server 端) 採用 HTTP 協定,該協定只是單純回應客戶端 (我們稱為 Client 端,通常是使用者瀏覽器) 文件要求,即 Client 端要求什麼,Server 就傳回什麼,因此在 HTTP 協定下,Server 只有傳回靜態文件能力而已,無法像各種平台上伺服器一樣,藉由執行各類應用程式,來達成客戶端的各種查詢或交易等要求。
    為了彌補此一缺點,WEB 伺服器勢必要藉助外部程式來執行 Client 端的要求,再將處理結果傳回給 Client 端。例如:使用者輸入一個關鍵字,要求列出某些書籍作者或書名,Server 接收到這個關鍵字之後,交由外部程式去處理,通常是由資料庫中去尋找,最後將尋著結果回應給 Server,Server 再將它傳回給瀏覽器端的使用者。
    CGI 就是提供給外部程式一種介面,只要符合此一介面標準,程式設計師便可以輕鬆地使用該平台上支援任何一種程式語言來撰寫外部程式,於是我們說:凡是符合 CGI 介面標準外部程式,就稱之為 CGI 程式。
    撰寫 CGI 程式,常見語言有 Perl、Python、C、C++、VB,甚至某些 UNIX 中的 shell script 都有人使用。
    我們可以這樣來看待 CGI 以及 CGI 程式:
    CGI 程式是 WEB 伺服器應用能力擴充(Extension),而 CGI 則是此一擴充能力介面,熟悉瞭解此一介面的原理及運作方式,我們便可以為 WEB 伺服器建立即時互動能力,以滿足客戶端的要求。

    3. 有那些程式語言可以寫 CGI? Program Languages

    CGI 可以使用電腦語言 Computer Language

      大部份CGI程式都是AppleScript、C、C++、Perl、TCL、任何一種UNIX shell、或是Visual Basic
    來寫作。這些語言不是唯一可以用程式語言,但是他們都是最常用語言之一。我們可以選擇任何語言來
    撰寫程式,但是有兩個好理由支持我們使用上述這些常用語言之一來作為開發工具。

      首先,使用分享程式碼來寫作CGI程式效率較高。很多常用功能已經在全球資訊網上有程式碼可直接引
    用了。另外有好幾個程式碼已經是免費開放讓其他程式撰寫者來引用。只要在資訊網上多逛逛,就能找到可
    以引用程式片段。在附錄中的 "Script Archive" 一節裡,有一份列表記載了很多可引用程式碼位置。
    表格、存取記數器、還有shopping cart,上述這些只是極少數可以引用程式碼例子,其他還有很多,只
    是無法一一例出。大部份這些分享程式碼甚至還給予使用者原始碼(source code),能夠修改來適應各個不
    系統。我們可以想像得到,絕大部分CGI程式都是以上述這些語言其中之一寫成,所以呢,如果你
    已經會用其中任何一種的話,趕快裝好它吧!這些程式列表也收集了很多有用函式庫可以拿來處理表格和傳
    回正確標題。

    4. 什麼是CGI環境變數? Environment Variables

    CGI 環境變數 CGI Environment Variables
    CGI 環境變數   當瀏覽器向伺服器要求一個CGI程式,伺服器是以無狀態環境(Stateless Environment)來開始執行這CGI程式
    這表示CGI程式是在自已狀態或是環境下執行。它並不會承繼伺服器程式所使用執行環境。因為這樣伺服器可以在同一時間接受許多瀏覽器要求,並執行同一個CGI程式而不會有任何衝突。
    這些同時在運作CGI程式相互之間必需是獨立,否則可能會有問題發生。正因為伺服器為CGI程式建立了一個新環境。它把幾乎所有資訊都放在環境變數裡。
    AUTH_TYPE 包含了所有用來確認瀏覽號器認證方法。其中一個例子是username/password格式。
    CONTENT_TYPE 使用者所提供用來要求CGI程式內容,是經由瀏覽器傳送過來。因為這個內容是以字串(string)方式來傳遞,所以這個變數值單位是一個位元組(byte),每個位元代表一個字元。
    CONTENT_TYPE 包含了伴隨著瀏覽器對CGI程式要求所使用資料種類。如text/html或者是image/jpeg。
    GATEWAY_INTERFACE 代表使用中的CGI版本。對1.1版CGI而言,變數是寫成CGI/1.1。
    PATH_INFO 包含了CGI程式路徑額外資訊。一般都是連CGI程式會用到文件所在虛擬路徑。這個值從要求CGI程式URL中附加資訊所設定。看一看PATH_TRANSLATED作為範例。
    PATH_TRANSLATED 變數值為從PATH_INFO虛擬位址轉換過來的實體位址。假設文件檔根目錄是/usr/www/這個目錄。對http://www.robertm.com/cgi/bin/calculate.pl/cgi-data.txt這個URL位址而言,PATH_INFO這個變數值是/cgi-data.txt,而PATH_TRANSLAED這個變數值是/usr/www/cgi-data.txt。
    QUERY_STRING 當使用者要求方法是GET時,包含了使用者提供資料。這個資料會加一個問號在參考到URL。如: http://www.robertm.com/cgi-bin/answer.pl?state=CA,QUERY_STRING這裡是"state=CA"。
    REMOTE_ADDR 儲存了向CGI程式作要求灠覽器所在機器之IP位址。
    REMOTE_HOST 儲存了向CGI程式作要求瀏覽器所在機器之Domain Name。如果找不到的話,就只使用REMOTE_ADDR而不用REMOTE_HOST。
    REMOTE_IDENT 只有當伺服器支援認證程序時,儲存使用者登錄名字。
    REMOTE_USER 儲存為了身份的確認而由Web瀏覽器選定使用者名稱。只有在伺服器支援身份確認和CGI程式是被保護這個變數才被使用。
    REQUEST_METHOD 包含了要求CGI程式要求方法。可以是任何一個http要求方法如GET、HEAD、POST、PUT等等。
    SCRIPT_NAME 儲存被執行CGI程式名稱和虛擬路徑。只用在自我參考URL。
    SERVER_NAME 儲存伺服器所在機器名字,不管是Domain Name或是IP位址。
    SERVER_PORT 儲存瀏覽器送要求訊息到伺服器時所用連接埠號碼。
    SERVER_PROTOCOL 儲存向CGI程式作要求傳輸協定名稱和版本。在大部分情形下,這個變數值都是http傳輸協定,如HTTP/1.0。
    SERVER_SOFTWARE 儲存執行CGI程式Web伺服器軟體名稱及版本。如: Netscape Communication Server 1.0版,變數值為Netscape-Commuications/1.1。也就是架網站伺服器軟體及版本。
    http 要求標頭環境變數 除了CGI環境變數之外,還有有關伺服器接收瀏覽器所傳來HTTP要求標頭相關變數。這些變數也是屬於環境變數範圍之內,都以HTTP_*為開頭。
    HTTP_ACCEPT 儲存了一連串以逗號分隔瀏覽器能接受媒體類型。audio/basic、image/gif、text/*、*/*。最後兩個例子用了萬用符號*,*是任何字串或字元標準輸入。text/*表示所有型態文字都可以。而*/*則表示瀏覽器會接受任何一種型態內容。
    HTTP_ACCEPT_ENCODING 儲存從伺服器端傳往瀏覽器端所用加碼方式。如: x-zip、x-stuff和x-tar。
    HTTP_ACCEPT_LANGUAGE 儲存了瀏覽器所使用國家語言種類。然而以不在這個變數範圍之內語言作回應也是可以。像en_UK,代表就是English of the United Kindom。
    HTTP_AUTHORIZATION 包含了瀏覽器授權資訊。是瀏覽器用來向伺服器取得認證許可變數。這個變數並沒有特定格式,我們可以使用任一種可被認證方式。舉一個例子,像user/password格式,以作者例子變數值就是robertm/作者密碼。
    HTTP_CHARGE_TO 這一個變數格式尚未統一。用處是可以向使用者作收費紀錄。
    HTTP_FORM 包含了提出要求使用者電子郵件位址。以作者為例: robertm@deltanet.com 或是 rmcdanie@primenet.com。
    HTTP_IF_MODIFIED_SINCE 儲存了一個符合APPANET標準日期,如星期幾,DD-Mon-YY HH:MM:SS 時區。這個值可以和GET這個要求方法作結合,用來退回太久沒作修正被要求文件檔。
    HTTP_PRAGMA 儲存了任何對伺服器所下的特殊指令。如: 一個proxy伺服器對要求標題就有一個本變數值: no cache。意思是proxy伺服器對每一份文件要求都必需向真正Web伺服器作要求,而不是從硬碟中拿出過期快取(cache)文件。
    HTTP_REFERER 儲存了內容裡有現在正被要求文件檔文件制式資源辨識子(uniform resource identifier,URI,是URL超集合)。例如http://www.thepalace.com/web-page.html。
    HTTP_USER_AGENT 儲存作出要求瀏覽器軟體名稱。舉例來說,像Moailla/2.0 (Win95),就是Netscape在Win95上2.0版瀏覽器。
    parsed標頭   每一個CGI程式都必需在它所要傳回資料之前加上parsed標頭。parsed標頭就是被伺服器說明CGI程式輸出結果中的幾行程式碼。parsed標頭格式和任何可以傳送環境變數HTTP標題都一樣。所有CGI環境變數都可以在psrsed標頭中使用。parsed標頭之後必需馬上有一行空白列。在parsed標頭中任何不是伺服器可接受指令,都會被當做HTTP回應標頭一部份而傳回給瀏覽器。目前CGI版本,1.1版,定義了三個伺服器指令在以下表格中。
    Content-type 告訴伺服器由CGI程式傳回資料MIME類型。
    Location 代表的是虛擬路徑或你的CGI程式要傳回文件之URL。
    Status 傳回HTTP狀態列給伺服器,伺服器再把它傳給瀏覽器。狀態列由一個三位元狀態碼和reason string所組成。像404 Not Found和403 Forbidden 都是其中一種。
    以下是一個CGI程式傳回竹parsed標頭範例:

    #!/usr/local/bin/perl

    print "Content-type: text/html\n\n";

    第一行 #!/usr/local/bin/perl 是指perl直譯器執行路徑,必需依然系統設定不同更改。

    不經過伺服器傳回方式   大部分伺服器都允許CGI程式直接把執行結果傳回給瀏覽器。以Netscape Commuication Server 為例,可以在你的CGI程式程式名之前加上 nph-,來表示你的程式要把結果直接傳回給瀏覽器。當CGI程式直接把執行結果傳回給瀏覽器時,程式本身必需去產生出一個包含正確HTTP回應標題和nonparsed標頭。
    HTTP回應標頭 意義
    ALLOWED 對提出要求瀏覽器列舉出哪些要求方法是被允許。像GET、HEAD、POST和PUT都是。
    CONTENT-ENCODING 列舉出哪些加碼方法是可用。x-zip、x-stuffit和X-tar都是其中之一。
    CONTENT-LANGUAGE 指出傳回文件是以何種語言撰寫。英文 (English) 就是其中一種。
    CONTENT-LENGTH 指出傳回資料大小 (以 byte 作單位)。
    CONTENT-TRANSFER-ENCODING 代表的是在伺服器和瀏覽器之間資料傳輸是以何種型式在進行。預設值是binary。
    CONTENT-TYPE 說明了被傳送資料是何種類型。像text/html和image/gif等等皆是。
    COST 代表的是存取這一份資料所要花費金額。但這個格式尚未正式被採用。
    DATE 代表這份被要求文件產生日期,日期格式是APPANET格式。
    DERIVED-FORM 包含了被要求文件之版本編號。允許可編輯文件作版本控制。
    EXPIRES 指的是被要求文件期滿時間。超過這個日期這份文件就必需要重新存取一次。這個標頭主要是用在快取(cache)功能,日期格式還是ARPANET格式。
    LAST-MODIFIED 本文件最後一次被更改日期。日期格式是ARPANET格式。
    LINK 包含了被傳回文件資訊。可以利用這個標頭來知道像這份文件引用了哪一個URL,或是這份文件作者。
    MESSAGE-ID 包含了HTTP訊息 (message) 唯一辨識子。
    PUBLIC 相當類似於ALLOW回應標頭。但是它列舉出了每一個人都能用要求方法而不是只有瀏覽器可以使用
    例子有: GET、HEAD和TEXT-SEARCH。
    TITLE 包含了被傳回文件標題。對一個HTML格式檔案而言,相當於是在兩個標籤之間值 "免費CGI程式下載"。
    URI 給出可以找到被要求文件 URI (uniform resource identifer)。這個值不一定是使用者所給URL。但是會和傳回來URL幾乎相同只是帶有些許小差異。
    舉例來說: http://www.robertm.com/Group-one/sectionl.htmlvary=language,version。這個值可能是和URL完全相同或是在language或version上有一點變化。
    VERSION 定義出一份文件可以被更改版本。
    這個標頭格式目前尚未有明確定義。
    我們不必為了得到正確noparsed標頭而去提供每一個HTTP回應標頭。舉例來說: 一個有正確nonparsed標題CGI程式看起來就該像下面這個程式。

    #!/usr/local/bin/perl

    print "HTTP:/1.0 200 ok\n";
    print "Server: Netscape-Communications/1.1\n";
    print "Content-type: text/html\n\n";

    5. 什麼是真實路徑、虛擬路徑?

    虛擬路徑
    就是文件或目錄所在網址。
    範例: http://thor.prohosting.com/~morii/cgi/ 緒如此類型式。
     
    真實路徑
    真實路徑就是文件或目錄在伺服器電腦裡路徑。
    範例: /user/www/ 緒如此類,這是在unix主機下的型式。

    HTML和CGI是天作之合?

    瀏覽器要HTML標籤

    幫CGI找個家

    CGI和HTML誰當家

    CGI進階
    有用環境變數
    什麼是Cookie庫記?
    FORM表單使用

    vi用法

Visit Cooltang's Homepage TOP