精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>网络专区>>● 网站建设>>盖世神功 — 网站建设技术>>CGI>>CGI脚本

主题:CGI脚本
发信人: tomup(笑望天)
整理人: eagle(2002-01-29 09:02:34), 站内信件
目录 
CGI脚本是什么?  
CGI脚本 怎样工作的?  
一个简单的例子  
我能用CGI脚本吗?  
你的服务器配置允许CGI脚本吗?  
你能编程吗?  
你应该用什么编程语言?  
你的服务器设置正确吗?  
如果你的服务器不是UNIX系统呢?  
解剖CGI脚本  
输出头部  
输出数据部  
带阐述的脚本  
传递其他信息给脚本  
创建特殊的脚本输出  
以装载另一个文本响应  
无响应  
处理表单的脚本  
表单格式和表单脚本  
GET 和 POST  
URL 编码  
问题  
CGI 变量  
解码程序  
uncgi  
cgi-lib.pl  
解码文件上传的输入  
自己做  
非解剖的头部脚本  
总结  

学习CGI脚本 (脚本) 
CGI 意思为 Common Gateway Interface, 一种基于浏览器的输入、在Web服务器
上运行的程序方法. CGI脚本 使你的浏览器与用户能交互,为了在数据库中寻找
一个名词, 提供你写入的评论,或者从一个表单中选择几个条目并且能得到一个
明确的回答. 如果你曾经遇到过在web上填表或进行搜索, 你就是用的CGI脚本. 
你那时也许没有意识到,因为大部分工作是在服务器上运行的,你看到的只是结
果.  

作为一个网页设计者, 你创建客户端的 CGI脚本, 服务器端的程序用来处理用户
输入, 结果返回给用户.  

在这里你将学习关于CGI脚本的一切:  

CGI脚本是什么?它是怎样工作的  
一个CGI脚本输出象什么?  
怎样用参数或无参数创建一个CGI脚本  
怎样创建一个返回规定响应的CGI脚本  
怎样创建一个输入表单的CGI脚本  
有关在使用CGI脚本中的问题  
你能在脚本中使用的CGI变量  

----------------------------------------------------------------------
---------- 

本章节假设在UNIX系统下的。  



----------------------------------------------------------------------
---------- 

CGI脚本是什么? 
CGI脚本简单地讲是个运行在Web服务器上的程序, 有浏览器的输入触发. 这个脚
本通常象服务器和系统中其他程序如数据库的桥梁。  

CGI 脚本难道不是一个真正的脚本?按照你的服务器的支持, 他们可能是一个编译
好的程序或者批命令文件或者其他可执行的东西. 为了简单起见,我们统称他们
为脚本scripts.  



----------------------------------------------------------------------
---------- 

CGI 脚本是任何运行在web服务器上的程序. CGI意思是Common Gateway Interfa
ce。   


----------------------------------------------------------------------
---------- 

CGI脚本是用下列两种方法使用的: 作为一个表单的ACTION 或 作为一个页中的直
接link。  

CGI脚本是怎样工作的? 
CGI脚本有服务器调用, 基于浏览器的数据输入.  

这有个简短的示意解释:  

一个URL指向一个CGI脚本. 一个CGI脚本的URL能如普通的URL一样在任何地方出现
。  
服务器接收请求, 按照那个URL指向的脚本文件(注意文件的位置和扩展名),执行
脚本.  
脚本执行基于输入数据的操作,包括查询数据库、计算数值或调用系统中其他程
序.  
脚本产生某种Web服务器能理解的输出结果.  
服务器接收来自脚本的输出并且把它传回浏览器,让用户了解结果。  

一个简单的例子 
这里详细一步一步地解释所有有关发生的细节。 

Display Date处是个指向CGI脚本的连接. 它的HTML是这样的:  

Display the Date

说明是个CGI脚本是因为这里面有个cgi-bin的路径. 在许多服务器cgi-bin是仅能
够放置CGI脚本 的目录.  

当你选择这个连接时, 你的浏览器将向www.popchina.com服务器提出请求. 服务
器接收这个请求计算出URL处的脚本文件名然后执行这个脚本.  

这个getdate脚本, 在UNIX系统中执行是这样的:  

#!/bin/sh 


echo Content-type: text/plain 

echo 

/bin/date 
第一行是个特殊的命令,告诉UNIX系统这是个shell脚本; 真实的情况是从这行开
始的下一行,这个脚本做两件事:它输出行Content-type: text/plain, 接着开
始一个空行;第二, 它调用UNIX系统时间date程序, 这样输出日期和时间. 脚本
执行后输出应该这样:  

Content-type: text/plain 





Tue Oct 25 16:15:57 EDT 1994 
这个Content-type是什么东东?它是个特殊的编码,Web服务器用来告诉浏览器输
出这个文本是什么类型的. 这与HTML中Content-type含义是一样的。  

这是最基本的,实际情况要复杂得多,总之可以用来理解浏览器、服务器和脚本
之间是怎样工作的。  

我能用CGI脚本吗? 
在你使用CGI脚本之前,有两件事你也许要解决:CGI脚本 是个高级的Web特性并
且需要你和Web   服务器管理者一样好的知识。  

肯定吗?就是做不到,学学也可以?好吧!让我们继续.  

你的服务器配置允许CGI脚本吗? 
为了能写和运行CGI脚本, 你需要一个Web服务器. 不象通常的HTML文件, 你不能
在本地系统上写或试验你的CGI脚本; 你得通过Web服务器来做这个.  

但是即使你有一个Web服务器, 这个服务器必须特别地为运行CGI脚本配置一下. 
那意味着你所有的脚本必须放置在一个叫做cgi-bin的目录下.  

在编写CGI脚本之前, 询问你的服务器管理者是否允许你安装和运行CGI脚本, 并
且如果可以的话,他们必须放置在哪儿?还有,你必须有个真正的Web服务器,如
果是FTP或Gopher服务器,那你就不能用CGI.  

如果你在自己的服务器上运行, 你必须特别地创造一个叫cgi-bin的目录,并配置
你的服务器认可这个目录为一个脚本目录. 也必须记住下面有关CGI脚本特点:  


每个脚本是个程序, 它运行在浏览器可以请求的系统上, 执行时使用CPU时间和内
存. 如果有成打上千的这些脚本同时运行,会怎样?你的系统将不忍负载直至崩
溃。  
如果你不仔细地编写你的CGI脚本, 你将有可能让别人通过你的CGI脚本参数进入
伤害你的系统.  
你会编程吗? 
初学者注意! 一般地, 你必须具备一些基本编程概念与方法。你必须有类似系统
工作的经验。如果你没有这些背景, 你必须去学习,好了,费话不多说.  

你必须用什么编程语言? 
你可以用你熟悉的任何语言编写CGI脚本, 只要你的脚本遵守下一节所陈列的规则
即可,只要那个语言能在你的Web服务器系统上运行. 在这本学习手册中,仅用两
种语言编写CGI脚本: UNIX shell和 Perl语言. 这个shell是适合在任何相近的U
NIX系统上运行并且容易学习, 但是处理复杂的情况就困难了. Perl, 就要用这个
语言了, 它是免费的, 这个语言是稳定和强大的,类似C,但它也是较难学习的.
  

你的服务器设置正确了吗? 
为了运行任何一个CGI脚本, 不管简单或复杂的,你的服务器必须设置成能够运行
他们,必须放置在一个特定的目录,必须有一个依赖你服务器设定的文件扩展名
. 如果你是租用服务器,就要是否允许运行CGI脚本. 如果你拥有自己的服务器,
检查你的服务器说明书是怎样处理CGI脚本的.  

如果你用的不是UNIX? 
只好再找别的学习手册了。  

解剖一个CGI脚本 
如果你编写它很久,克服很多警告和配置,恭喜你,你已经会些CGI脚本,并且可
以在你的网页上使用了. 在这一章,将学习脚本是怎样执行,你的服务器又是怎
样与他们对话产生回应的。  

输出头部 
虽然你的CGI脚本可以让你做任何事情,但是脚本的输出还是必须有一个规定形式
.  



----------------------------------------------------------------------
---------- 

这个 "脚本输出" 意思是指你的脚本发回服务器的数据. 在UNIX系统中, 输出是
发向标准输出, 服务器从那儿检测它. 在其他系统和服务器, 你的脚本输出也许
不一样了.  



----------------------------------------------------------------------
---------- 

这个头部是实际不是文本的一部分,是服务器与浏览器之间的信息协议,你实际
看不到。  

有三个类型的头部: Content-type, Location, 和Status. Content-type 最普遍
的。  

有关content-type解释可以见有关HTML的说明, 一个你可以发出的特定编码象这
样:  

Content-type: text/html 
在这个例子中,输出数据的类型是text/html; 换句话说, 他是个HTML文件.  

表1. 通用格式和content-types. 

Format 
 Content-Type 
  
HTML text/html  
Text text/plain  
GIF image/gif  
JPEG image/jpeg  
PostScript application/postscript  
MPEG video/mpeg  

注意content-type 后面必须跟一个空行. 如果你没有空行,服务器将无法搞清这
个头部在哪里结束。  

输出数据 
你输出的数据应该符合你所规定的content-type; 如果content-type是text/htm
l, 输出安置应该是在HTML. 如果content-type是image/gif, 输出应该是在一个
二进制的GIF文件.  

练习1: 小试试. 
T这是个简单的输出日期的简单脚本,这个CGI脚本还检查看看我是否已经登陆到
我的Web服务器,并且报告发现了什么.  
这是个很简单的例子, 他能这样备调用:  

Is Laura Logged in

这是没有输入的脚本,它只运行并且返回数据.  

根据前面的阐述,这个脚本内容是这样::  
#!/bin/sh  

echo Content-type: text/html 

echo "<HTML><HEAD>"  

echo "<TITLE>Is Laura There?</TITLE>"  

echo "</HEAD><BODY>"  
为了测试我是否已经登陆系统,用who命令(我的登陆名假设为lemay), 储存结果
在变量ison中. 如果我登陆, 变量ison将有些内容,否则则是空的.  

ison='who | grep lemay' 
试验结果及返回相应提示的脚本是这样:  

if [ ! -z "$ison" ]; then 

        echo "<P>Laura is logged in."</P> 
else 

      echo "<P>Laura isn't logged in."</P> 

fi 
最后关闭HTML:  

echo "</BODY></HTML>" 
现在你通过从命令行运行他,测试一下,你将得到一个结果说我未登陆你的系统
,当然不可能的,他的输出是这样的:  

Content-type: text/html 

<HTML><HEAD> 

<TITLE>Are You There?</TITLE> 

</HEAD><BODY> 

<P>Laura is not logged in. 

</BODY></HTML> 
这是输出的一个HTML文本,这样你的浏览器能正常显示他,因为他是个HTML文件
。    



----------------------------------------------------------------------
---------- 

现在将他copy到你的服务器的cgi-bin目录下,去执行,如果你不能达到CGI-bin
目录,你必须询问你的服务器管理者,你不能理所当然地自己建立个CGI-bin目录
,那没用的。 


----------------------------------------------------------------------
---------- 

这个例子完整的脚本如下:  

#!/bin/sh 

echo "Content-type: text/html" 


echo 


echo "<HTML><HEAD>" 

echo "<TITLE>Is Laura There?</TITLE>" 

echo "</HEAD><BODY>" 

ison='who | grep lemay' 

if [ ! -z "$ison" ]; then 

        echo "<P>Laura is logged in" 

else 
        echo "<P>Laura isn't logged in" 

fi 

echo "</BODY></HTML>" 
带有参数的脚本 
为了传递一个参数给脚本,可以在URL中使用 (?) 插入脚本名词和参数之间, 用
加号(+) 表示每个单一的参数, 如:  

<A HREF="/cgi-bin/myscript?arg1+arg2+arg3">run my script 
当服务器接收到这个请求,它传递 arg1, arg2, 和 arg3 参数给脚本. 你然后能
在脚本中使用这些参数.  

这个方法有时叫查询, 因为早期它用在搜索功能中.  

练习2: 检查是否有人登陆. 
既然你知道怎样使用参数,让我们继续上面的例子pinglaura,通过修改这个例子
我们得到下面这个脚本pinggeneric.  

我们取个不同题目:  

#!/bin/sh 


echo "Content-type: text/html" 

echo 

echo "<HTML><HEAD>" 

echo "<TITLE>Are You There?</TITLE>" 

echo "</HEAD><BODY>" 
在上面的例子中, 下一步应该是测试我是否登陆,在这里我们用参数${1}代替我
的名字lemay,   ${1}作为第一个参数, ${2}作为第二个, ${3}作为第三个.  

ison='who | grep "${1}"' 

----------------------------------------------------------------------
---------- 

剩下的所有修改如下:  

if [ ! -z "$ison" ]; then 


        echo "<P>$1 is logged in" 


else 

        echo "<P>$1 isn't logged in" 


fi 
echo "</BODY></HTML>" 
好了,让我们修改HTML页中的连接吧!原来是这样:  

Is Laura Logged in?

修改为通用查询功能后是这样,比如查询名字叫john的人是否登陆:  

Is John Logged i
n? 
在你的服务器上试试,看是否有结果。  

传递其他信息给脚本 
有第二种方法传递信息给CGI脚本. 它叫作路径信息path information 用作那些
在脚本调用是不用变更的参数, 象一个临时文件名或调用脚本自己的文件名. 正
如你看到的,在上面的例子问号后面的参数是因用户表单的输入而改变的. 路径
信息Path info用作其他信息传递给脚本,实际上,你可以用它作任何事情.  






----
              _..._
             .     '.      Http://www.tomup.com
     ,_     /          }
    ,_\'--, \   _.''~/     E-mail:[email protected]
     \'--,_'{_,}    -(            [email protected]
     '.'-.'\;--,___.'_            [email protected]
        '._'/    |_ _{@}   Oicq:2382228       _
          /     ' |-';/         {@} _
         /   \    /  |       \>{@}>{@}_
        /     '--;_        _ {@}  >_Y{@}
       _\          '\     {@}\Y/_{@} Y/
      / |'-.___.    /     \Y/\|{@}Y/\|//
^^^^^'--'------''--'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^              
     世上本无世外桃源,如果要说有,那就是在你的心里。 

[关闭][返回]