一、设置ncsa server或apache server以使用cgi
ncsa server的cgi1.1只允许用下列两种方式激活用户服务器上的脚本:scriptalias指令和addtype指令。这两条指令都放在srm.conf文件中,该文件一般在用户的服务器根目录的conf目录中。
scriptalias指令告诉服务器该目录中的所有文件都是脚本或者是服务器作为cgi文件执行的程序。该方法能保证用户的cgi程序在特定位置。addtype指令允许用户告诉服务器任何具有指定前缀的文件都是可执行文件。如果希望将cgi程序放在服务器中任何地方的话该指令即很有用。
1、scriptalias指令
scriptalias指令位于server resource map文件(srm.conf)中,程序内容例如下:
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文件允许用户根据自己系统需要设置http server。它允许用户告诉服务器用户的主页在什么地方,目录中的哪个文档是索引文档,如果不存在索引文件的话将装载什么图片文件以显示文件的类型,等等。srm.conf及其他配置文件的说明可查阅http://www.nease.net/tppmsgs/msgs0.htm#34。
2、addtype指令
addtype指令是执行cgi程序的另一种方式,它是在srm.conf文件中加入下列行:
addtype application/x-httpd-cgi.cgi
在自己的系统中设置了该指令后,任何在服务器控制范围内的扩展名为.cgi的文件都会被作为cgi程序执行而不是作为文本文件阅读。这意味着用户可以在他的个人目录中创建脚本并能执行它。但是如果脚本写得不正确,就可能导致对文件系统、口令文件等的不同类型伤害。
addtype指令可以扩展为允许扩展名不是.cgi的程序同样被执行。大家经常会看见以.pl(perl脚本的常见扩展名)或.sh(bourne shell脚本的常见扩展名)结尾的脚本。如果想支持其他扩展名的程序,只需简单地将它们加入addtype指令中,如下所示:
addtype application/x-httpd-cgi .cgi .pl .sh
3、访问配置文件
为了支持cgi程序的执行必须多加入一条指令。在server root/conf目录中是一个名为access.conf的配置文件。该文件允许用户设置serverroot下的哪个目录能够访问的全局限制,甚至允许用户控制哪些站点可以访问这些目录。下面是access.conf文件的一个例子:
<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表示允许执行该目录中的cgi脚本。options indexes followsymlinks表示允许索引(显示某文件夹中的内容)并能够遵循符号链(这就意味着在serverroot之外的文件也能被访问)。allowoverride指令允许用户决定哪个指令可以被目录的.htaccess文件覆盖。中设置了对该目录中允许使用get方式的限制。在httpd中,部分指令的选项是get、post和put(目前put尚未实现)。order allow,deny一行告诉服务器先找allow行再找deny行。下一行则是告诉服务器允许所有站点访问该目录中的页面。
二、设置cern http服务器以使用cgi
cern http服务器(也称为w3c http服务器)仅需要编辑/etc/httpd.conf文件即可支持在服务器内使用cgi程序。这个指令类似于ncsa server使用的指令:
exec /url-prefix/* /physical-path/*
其中/url-prefix/定义了客户能看见的路径,而/physical-path/则是包含脚本的目录的实际路径。
三、设置netscape以使用cgi
首先要启动管理服务器。以root身份登录,并运行/serverroot/admserv/start-admin,缺省端口为81。然后启动浏览器连接。在netscape admin页面中,单击select url mapping,从弹出窗口中选择map a url to a local directory。然后单击select cgi and server parsed html,从弹出窗口中选择activate cgi as a file type。现在即可单击browse files并选择欲激活的目录。选择完目录后,单击i'd like to activate cgi as a file type。在serverroot中即会看到conf目录中的obj.conf配置文件中已加入了下列行:
nametrans form="/cgi-bin" fn="pfx2dir" dir="/usr/local/web/cgi-bin" name="cgi"
name=cgi调用了下列行:
<object name="cgi">
objecttype fn="force-type" type="magnus-internal/cgi"
service fn="send-cgi"
</object>
它告诉服务器此为一个cgi目录,其中的所有文件都将用netscape内部提供的cgi执行。
四、设置iis以使用cgi
在iis上运行cgi有十个简单的步骤:
1)安装internet service manager。
2)从列表中选择www servive。
3)选择properties/service properties命令。
4)单击directories标签。
5)单击add按钮。
6)指定自己的cgi-bin目录的完整路径(例如,c:\webfiles\scripts)。
7)使用/scripts作为目录别名。
8)选中execute检查框。
9)单击ok保存修改。
10)将自己的cgi程序放在c:\webfiles\scripts中并在html中作为/scripts/someprogram.exe引用。
在使用iis时经常出现的问题与设置iis没太大关系而是和基本的操作系统功能有很大关系。iis与底层的操作系统联系很紧密,即使已经设置为服务,web服务器基本上是作为应用程序来运行的,通常只有一个用户安全环境,web服务器能访问到的与web服务器下的cgi程序能访问到的内容几乎没什么不同(这类似于unix环境,在unix环境下,很重要的一点就是不要将web服务器作为root来运行)。iis的工作很像一个扩展的文件系统。每个用户有自己的权限。cgi程序在执行该程序的访问者的用户安全环境中运行。对于未验证的页面,这就是缺省提供的“无名的”用户,而对验证的页面,安全环境就像用户位于服务器控制台前手工运行该程序一样。使大部分初学者犯错误的正是这种额外的安全层次。
iis管理员最常抱怨的一个错误信息是"the application misbehaved by not returning a complete set of headers"。错误消息接下来列出服务器接收到的头标--一般是个空的清单。这种讨厌的不明确的错误有一个直接的原因,不过这个原因与cgi脚本的错误操作没有一点关系。如果因为某种原因某个cgi脚本不能运行,它就不能产生任何头标。iis将错误的责任推在脚本身上,实际上却几乎总是服务器管理员的错。cgi脚本需要访问系统dlls、系统的临时目录以及它们使用的任何其他资源。如果该脚本是按静态约束进行编译的,那么除非所有组件均可用,否则操作系统不会装载该程序的。如果系统管理员锁紧了安全级使得脚本不能装载它的dlls,那么脚本就不能运行。当脚本不能运行时,它也就不产生任何头标了(或者其他的输入),从而导致出现本段开头引用的错误消息。
如果管理员是在一个安全目录中运行脚本的(安全目录即是一个需要单独用户验证才能访问的目录),那么每个可能访问系统的用户都必须有下列安全权限。如果是无名地运行脚本,那么只有无名用户需要这些权限:
.对%systemroot%system(一般为c:\winnt\system)的读权限
.对%systemroot%system32(一般为c:\winnt\system32)的读权限
.对临时目录(一般为c:\temp)的修改权限
.对web根的读权限
.对cgi目录的修改权限
如果在有了这些访问权限之后仍然出问题,可以进一步临时给特殊的用户帐号everyone赋予这些目录的修改权限。如果问题解决了,就可以认定是少了一个步骤(或一个用户)。纠正问题然后慢慢回收权限直至服务器重新安全。