| 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"; |