Perl 5教程
by flamephoenix

目录

第一部分 Perl语言

第一章 概述

第二章 简单变量

第三章 操作符

第四章 列表和数组变量

第五章 文件读写

第六章 模式匹配

第七章 控制结构

第八章 子程序

第九章 关联数组(哈希表)

第十章 格式化输出

第十一章 文件系统

第十二章 引用(指针)

第十三章 面向对象编程

第十四章 包和模块

附录一 函数集

第二部分 Perl的CGI应用

第一章 cgilib例

第二章 动态创建图像

第三章 计数器的编写方法

第四章 Web Server设置

第五章、...
 

第四章 设置Web Server以运行CGI

by flamephoenix

一、NCSA Server
二、CERN httpd
三、Netscape Server
四、IIS


一、设置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://hoohoo.ncsa.uiuc.edu/docs/setup/Configure.html

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赋予这些目录的修改权限。如果问题解决了,就可以认定是少了一个步骤(或一个用户)。纠正问题然后慢慢回收权限直至服务器重新安全。

上一章 下一章 目录