CGI教學(xué):第四章 設(shè)置Web Server以運(yùn)行CGI
發(fā)布時(shí)間:2008-08-06 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
一、NCSA Server
二、CERN httpd
三、Netscape Server
四、IIS
一、設(shè)置NCSA Server或Apache Server以使用CGI
NCSA Server的CGI1.1只允許用下列兩種方式激活用戶服務(wù)器上的腳本:ScriptAlias指令和AddType指令。這兩條指令都放在srm.conf文件中,該文件一般在用戶的服務(wù)器根目錄的conf目錄中。
ScriptAlias指令告訴服務(wù)器該目錄中的所有文件都是腳本或者是服務(wù)器作為CGI文件執(zhí)行的程序。該方法能保證用戶的CGI程序在特定位置。AddType指令允許用戶告訴服務(wù)器任何具有指定前綴的文件都是可執(zhí)行文件。如果希望將CGI程序放在服務(wù)器中任何地方的話該指令即很有用。
1、ScriptAlias指令
ScriptAlias指令位于Server Resource Map文件(srm.conf)中,程序內(nèi)容例如下:
DocumentRoot /usr/local/etc/httpd/htdocs
UserDir public_html
REdirect /HTTPD/ http://www.server.com/
Alias /icons/ /usr/local/etc/httpd/icons/
ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-bin/
DirectoryIndex index.html index.shtml index.cgi
IndexOptions FancyIndexing
AddIcon /icons/movie.gif .mpg .qt
AddIcon /icons/menu.gif
AddIcon /icons/blank.xbm
DefaultIcon /icons/unknown.xbm
IndexIgnore */.??* *~ *# */HEADER* */README*
DefaultType text/plain
AccessFileName .htaccess
srm.conf文件允許用戶根據(jù)自己系統(tǒng)需要設(shè)置HTTP Server。它允許用戶告訴服務(wù)器用戶的主頁(yè)在什么地方,目錄中的哪個(gè)文檔是索引文檔,如果不存在索引文件的話將裝載什么圖片文件以顯示文件的類型,等等。srm.conf及其他配置文件的說(shuō)明可查閱http://www.nease.net/tppmsgs/msgs0.htm#34。
2、AddType指令
AddType指令是執(zhí)行CGI程序的另一種方式,它是在srm.conf文件中加入下列行:
AddType application/x-httpd-cgi.cgi
在自己的系統(tǒng)中設(shè)置了該指令后,任何在服務(wù)器控制范圍內(nèi)的擴(kuò)展名為.cgi的文件都會(huì)被作為CGI程序執(zhí)行而不是作為文本文件閱讀。這意味著用戶可以在他的個(gè)人目錄中創(chuàng)建腳本并能執(zhí)行它。但是如果腳本寫得不正確,就可能導(dǎo)致對(duì)文件系統(tǒng)、口令文件等的不同類型傷害。
AddType指令可以擴(kuò)展為允許擴(kuò)展名不是.cgi的程序同樣被執(zhí)行。大家經(jīng)常會(huì)看見以.pl(Perl腳本的常見擴(kuò)展名)或.sh(Bourne Shell腳本的常見擴(kuò)展名)結(jié)尾的腳本。如果想支持其他擴(kuò)展名的程序,只需簡(jiǎn)單地將它們加入AddType指令中,如下所示:
AddType application/x-httpd-cgi .cgi .pl .sh
3、訪問(wèn)配置文件
為了支持CGI程序的執(zhí)行必須多加入一條指令。在Server Root/conf目錄中是一個(gè)名為access.conf的配置文件。該文件允許用戶設(shè)置ServerRoot下的哪個(gè)目錄能夠訪問(wèn)的全局限制,甚至允許用戶控制哪些站點(diǎn)可以訪問(wèn)這些目錄。下面是access.conf文件的一個(gè)例子:
<Directory /usr/local/etc/httpd/cgi-bin>
Options INdexes Exec CGI
</Directory>
<Directory /usr/local/etc/httpd/htdocs>
Options Indexes FollowSymLinks
AllowOverride All
<Limit GET>
order allow,deny
allow from all
</Limit>
</Directory>
Exec CGI表示允許執(zhí)行該目錄中的CGI腳本。Options Indexes FollowSymLinks表示允許索引(顯示某文件夾中的內(nèi)容)并能夠遵循符號(hào)鏈(這就意味著在ServerRoot之外的文件也能被訪問(wèn))。AllowOverride指令允許用戶決定哪個(gè)指令可以被目錄的.htaccess文件覆蓋。中設(shè)置了對(duì)該目錄中允許使用GET方式的限制。在HTTPD中,部分指令的選項(xiàng)是GET、POST和PUT(目前PUT尚未實(shí)現(xiàn))。order allow,deny一行告訴服務(wù)器先找allow行再找deny行。下一行則是告訴服務(wù)器允許所有站點(diǎn)訪問(wèn)該目錄中的頁(yè)面。
二、設(shè)置CERN HTTP服務(wù)器以使用CGI
CERN HTTP服務(wù)器(也稱為W3C HTTP服務(wù)器)僅需要編輯/etc/httpd.conf文件即可支持在服務(wù)器內(nèi)使用CGI程序。這個(gè)指令類似于NCSA Server使用的指令:
Exec /url-prefix/* /physical-path/*
其中/url-prefix/定義了客戶能看見的路徑,而/physical-path/則是包含腳本的目錄的實(shí)際路徑。
三、設(shè)置Netscape以使用CGI
首先要啟動(dòng)管理服務(wù)器。以root身份登錄,并運(yùn)行/ServerRoot/admserv/start-admin,缺省端口為81。然后啟動(dòng)瀏覽器連接。在Netscape Admin頁(yè)面中,單擊Select URL Mapping,從彈出窗口中選擇Map a URL to a Local Directory。然后單擊Select CGI and Server Parsed HTML,從彈出窗口中選擇Activate CGI as a File Type?,F(xiàn)在即可單擊Browse Files并選擇欲激活的目錄。選擇完目錄后,單擊I'd Like to Activate CGI as a File Type。在ServerRoot中即會(huì)看到Conf目錄中的obj.conf配置文件中已加入了下列行:
NameTrans form="/cgi-bin" fn="pfx2dir" dir="/usr/local/web/cgi-bin" name="cgi"
name=cgi調(diào)用了下列行:
<Object name="cgi">
ObjectType fn="force-type" type="magnus-internal/cgi"
Service fn="send-cgi"
</Object>
它告訴服務(wù)器此為一個(gè)CGI目錄,其中的所有文件都將用Netscape內(nèi)部提供的CGI執(zhí)行。 四、設(shè)置IIS以使用CGI
在IIS上運(yùn)行CGI有十個(gè)簡(jiǎn)單的步驟:
1)安裝Internet Service Manager。
2)從列表中選擇WWW Servive。
3)選擇Properties/Service Properties命令。
4)單擊Directories標(biāo)簽。
5)單擊Add按鈕。
6)指定自己的cgi-bin目錄的完整路徑(例如,c:\webfiles\scripts)。
7)使用/scripts作為目錄別名。
8)選中Execute檢查框。
9)單擊OK保存修改。
10)將自己的CGI程序放在c:\webfiles\scripts中并在HTML中作為/scripts/someprogram.exe引用。
在使用IIS時(shí)經(jīng)常出現(xiàn)的問(wèn)題與設(shè)置IIS沒(méi)太大關(guān)系而是和基本的操作系統(tǒng)功能有很大關(guān)系。IIS與底層的操作系統(tǒng)聯(lián)系很緊密,即使已經(jīng)設(shè)置為服務(wù),Web服務(wù)器基本上是作為應(yīng)用程序來(lái)運(yùn)行的,通常只有一個(gè)用戶安全環(huán)境,Web服務(wù)器能訪問(wèn)到的與Web服務(wù)器下的CGI程序能訪問(wèn)到的內(nèi)容幾乎沒(méi)什么不同(這類似于UNIX環(huán)境,在UNIX環(huán)境下,很重要的一點(diǎn)就是不要將Web服務(wù)器作為root來(lái)運(yùn)行)。IIS的工作很像一個(gè)擴(kuò)展的文件系統(tǒng)。每個(gè)用戶有自己的權(quán)限。CGI程序在執(zhí)行該程序的訪問(wèn)者的用戶安全環(huán)境中運(yùn)行。對(duì)于未驗(yàn)證的頁(yè)面,這就是缺省提供的“無(wú)名的”用戶,而對(duì)驗(yàn)證的頁(yè)面,安全環(huán)境就像用戶位于服務(wù)器控制臺(tái)前手工運(yùn)行該程序一樣。使大部分初學(xué)者犯錯(cuò)誤的正是這種額外的安全層次。
IIS管理員最常抱怨的一個(gè)錯(cuò)誤信息是"The Application misbehaved by not returning a complete set of headers"。錯(cuò)誤消息接下來(lái)列出服務(wù)器接收到的頭標(biāo)--一般是個(gè)空的清單。這種討厭的不明確的錯(cuò)誤有一個(gè)直接的原因,不過(guò)這個(gè)原因與CGI腳本的錯(cuò)誤操作沒(méi)有一點(diǎn)關(guān)系。如果因?yàn)槟撤N原因某個(gè)CGI腳本不能運(yùn)行,它就不能產(chǎn)生任何頭標(biāo)。IIS將錯(cuò)誤的責(zé)任推在腳本身上,實(shí)際上卻幾乎總是服務(wù)器管理員的錯(cuò)。CGI腳本需要訪問(wèn)系統(tǒng)DLLs、系統(tǒng)的臨時(shí)目錄以及它們使用的任何其他資源。如果該腳本是按靜態(tài)約束進(jìn)行編譯的,那么除非所有組件均可用,否則操作系統(tǒng)不會(huì)裝載該程序的。如果系統(tǒng)管理員鎖緊了安全級(jí)使得腳本不能裝載它的DLLs,那么腳本就不能運(yùn)行。當(dāng)腳本不能運(yùn)行時(shí),它也就不產(chǎn)生任何頭標(biāo)了(或者其他的輸入),從而導(dǎo)致出現(xiàn)本段開頭引用的錯(cuò)誤消息。
如果管理員是在一個(gè)安全目錄中運(yùn)行腳本的(安全目錄即是一個(gè)需要單獨(dú)用戶驗(yàn)證才能訪問(wèn)的目錄),那么每個(gè)可能訪問(wèn)系統(tǒng)的用戶都必須有下列安全權(quán)限。如果是無(wú)名地運(yùn)行腳本,那么只有無(wú)名用戶需要這些權(quán)限:
.對(duì)%systemroot%system(一般為c:\winnt\system)的讀權(quán)限
.對(duì)%systemroot%system32(一般為c:\winnt\system32)的讀權(quán)限
.對(duì)臨時(shí)目錄(一般為c:\temp)的修改權(quán)限
.對(duì)Web根的讀權(quán)限
.對(duì)CGI目錄的修改權(quán)限
如果在有了這些訪問(wèn)權(quán)限之后仍然出問(wèn)題,可以進(jìn)一步臨時(shí)給特殊的用戶帳號(hào)Everyone賦予這些目錄的修改權(quán)限。如果問(wèn)題解決了,就可以認(rèn)定是少了一個(gè)步驟(或一個(gè)用戶)。糾正問(wèn)題然后慢慢回收權(quán)限直至服務(wù)器重新安全。