`
purpen
  • 浏览: 795277 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习CGI脚本 (脚本)(一)

阅读更多

学习CGI脚本 (脚本)

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

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

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

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

<note></note>

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


CGI脚本是什么?

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

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


<note></note>

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


 

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

CGI脚本是怎样工作的?

CGI脚本有服务器调用, 基于浏览器的数据输入. 图1 显示在浏览器、服务器和脚本之间是怎样的一个流程.

图1. 从浏览器到服务器到脚本到程序 记住再回来噢!

这有个简短的示意解释:

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

一个简单的例子

这里详细一步一步地解释所有有关发生的细节。
图2:
19twp02.gif (19771 字节)

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含义是一样的。

这样浏览器的输出就如图3.

19twp03.gif (14868 字节)

 

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

我能用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是适合在任何相近的UNIX系统上运行并且容易学习, 但是处理复杂的情况就困难了. Perl, 就要用这个语言了, 它是免费的, 这个语言是稳定和强大的,类似C,但它也是较难学习的.

你的服务器设置正确了吗?

为了运行任何一个CGI脚本, 不管简单或复杂的,你的服务器必须设置成能够运行他们,必须放置在一个特定的目录,必须有一个依赖你服务器设定的文件扩展名.

如果你是租用服务器,就要是否允许运行CGI脚本.

 

如果你拥有自己的服务器,检查你的服务器说明书是怎样处理CGI脚本的.

如果你用的不是UNIX?

只好再找别的学习手册了。

解剖一个CGI脚本

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

输出头部

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

<note></note>

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


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

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

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

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

    表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/html, 输出安置应该是在HTML. 如果content-type是image/gif, 输出应该是在一个二进制的GIF文件.
练习1: 小试试.
T这是个简单的输出日期的简单脚本,这个CGI脚本还检查看看我是否已经登陆到我的Web服务器,并且报告发现了什么(如在图4).

19twp04.gif (15047 字节)
这是个很简单的例子, 他能这样备调用:

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

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

echo Content-type: text/html
 

echo ""
 

echo ""
 

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

ison='who | grep lemay'
试验结果及返回相应提示的脚本是这样:
if [ ! -z "$ison" ]; then


        echo "

Laura is logged in."




else


        echo "

Laura isn't logged in."




fi
最后关闭HTML:
echo ""
现在你通过从命令行运行他,测试一下,你将得到一个结果说我未登陆你的系统,当然不可能的,他的输出是这样的:
Content-type: text/html


<html></html><head></head>








Laura is not logged in.


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

 


<note></note>

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


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

#!/bin/sh

echo "Content-type: text/html"


echo

echo "<html></html><head></head>"

echo ""

echo ""

ison='who | grep lemay'

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

        echo "

Laura is logged in"

else

        echo "

Laura isn't logged in"

fi

echo ""

带有参数的脚本

为了传递一个参数给脚本,可以在URL中使用 (?) 插入脚本名词和参数之间, 用加号(+) 表示每个单一的参数, 如:
run my script
当服务器接收到这个请求,它传递 arg1, arg2, 和 arg3 参数给脚本. 你然后能在脚本中使用这些参数.

 

这个方法有时叫查询, 因为早期它用在搜索功能中.
练习2: 检查是否有人登陆.
既然你知道怎样使用参数,让我们继续上面的例子pinglaura,通过修改这个例子我们得到下面这个脚本pinggeneric.

我们取个不同题目:

#!/bin/sh


echo "Content-type: text/html"


echo


echo "<html></html><head></head>"


echo ""


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


剩下的所有修改如下:

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


        echo "

$1 is logged in"


else


        echo "

$1 isn't logged in"


fi

echo ""
好了,让我们修改HTML页中的连接吧!原来是这样:
Is Laura Logged in?
修改为通用查询功能后是这样,比如查询名字叫john的人是否登陆:
Is John Logged in?
在你的服务器上试试,看是否有结果。

传递其他信息给脚本

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

<note></note>

路径信息Path information是一种不象通常参数脚本那样频繁传递信息的方法. 路径Path information通常是指Web服务器上的那些比如配置文件、临时文件或者被脚本因问题调用的文件等等此类文件.


看下面一个路径信息path information例子, :

http://myhost/cgi-bin/myscript/remaining_path_info?arg1+arg2
当脚本运行时,在路径中的信息将被放置于环境参数PATH_INFO. 你能在你的脚本内容中使用这些信息.

比如说, 让我们假设你在多页上已有多个连接到同一个脚本. 你能用这个路径信息显示那个有连接的HTML文件名. 这样, 在你完成处理你的脚本之后, 当你发回一个HTML文件时, 你能在这个文件里包含一个连接,发回用户一开始那个页。

 

你会在下一章节学到更多路径信息:有用的表单和脚本. 待后来登出

创建一个特殊的脚本输出

现在你已经学习了诸如输出数据 一般地HTML数据 发给浏览器解释显示的数据. 但是如果你不想把脚本结果作为一个数据流形式发回浏览器,而是想把一个存在的页发回,怎么办? 如果你只是要脚本做一些事而不让任何结果回答给浏览器,怎么办?

 

不用怕, 这里开始解释这些情况.

用调用另一个文本作为响应

CGI输出不是非得一个数据流,有时可以告诉浏览器是存在服务器上的一个页,为了发出这个信息,看下面的例子:
Location: ../docs/final.html
这个Location行用作通常的输出位置,也就是说,如果你用了Location, 你就不必再用象Content-type这样的数据输出(实际上,你也不能). 正如Content-type, 你也必须在这一行后面跟一个空行.

指向这个文件的路径可以是一个URL或相对路径. 所有相对路径是指相对于脚本所在的位置. 例子中的final.html文本是在当前上一个目录下docs的目录下:

echo Location: ../docs/final.html


echo

<note></note>

你不能Content-type 和 Location两个输出同时使用. 比如, 如果你想输出一个标准页,但是想在这个页尾加上客户的内容, 你就得用Content-type自行组建这两个部分. 注意:你可以用脚本命令打开一个当地文件作为数据直接将之输出.


评论

相关推荐

    一个简单的CGI脚本——Web编程_v1.1归纳.pdf

    一个简单的CGI脚本示例是获取并显示本地时间。用户提交请求后,CGI脚本运行,获取系统时间,然后返回给浏览器展示。这种简单的交互展示了CGI的基本工作原理。 【CGI的适用场景】 CGI适合于小规模的应用,特别是那些...

    CGI脚本入门学习--HTML格式

    CGI脚本是什么? CGI脚本 怎样工作的? 一个简单的例子 我能用CGI脚本吗? 你的服务器配置允许CGI脚本吗? 你能编程吗? 你应该用什么编程语言? 你的服务器设置正确吗? 如果你的服务器不是UNIX系统呢? 解剖...

    怎么快速配置cgi脚本

    完成上述步骤后,你将拥有一个能够处理多种动态请求的Nginx服务器,通过fastCGI执行CGI脚本来提供服务。记住,编写CGI脚本时需遵循CGI规范,确保正确传递和处理HTTP请求参数。同时,确保spawn-fcgi进程在正确端口...

    cgi.rar_CGI脚本_cgi

    本资源包含了一份关于CGI脚本的PDF文档和一个可能包含相关链接或资料的TXT文件。 CGI脚本的主要工作原理是,当用户通过Web浏览器发送请求到Web服务器时,服务器接收到请求后,会调用CGI程序,将请求数据传递给它。...

    计算机软件-编程源码-CGI脚本入门学习.zip

    这个压缩包“计算机软件-编程源码-CGI脚本入门学习.zip”显然是一份用于初学者了解和学习CGI脚本编程的资料。 **CGI的原理** CGI为Web服务器提供了一个接口,当用户通过浏览器发送HTTP请求时,服务器接收到请求后会...

    CGI 脚本入侵快速上手+脚本使用方法

    当用户访问某个URL时,如果该URL指向的是一个CGI脚本,那么Web服务器会运行这个脚本,并将结果返回给用户。 #### 二、基本Unix命令 在进行CGI脚本入侵之前,了解一些基本的Unix命令是非常有帮助的,这些命令可以...

    cgi脚本教程

    本教程详细介绍了CGI脚本的使用和概念,适合对Web服务器和脚本编程感兴趣的学习者。 **29.1 Web页面** Web页面是由HTML(HyperText Markup Language)标记组成的文档。当浏览器访问一个Web页面时,它解析HTML标记...

    CGI学习文档

    1. 用户通过浏览器访问一个带有CGI脚本的URL。 2. Web服务器接收到请求后,识别出需要执行CGI脚本。 3. 服务器创建一个新的进程来运行CGI程序,将请求信息作为环境变量传递给该程序。 4. CGI程序处理请求,可能涉及...

    CGI跟我学 web编程

    CGI 脚本使您的浏览器与用户能交互,为了在数据库中寻找一个名词,提供您写入的评论,或者从一个表单中选择几个条目并且能得到一个明确的回答。 CGI 脚本是什么? CGI 脚本简单地讲是个运行在 Web 服务器上的程序,...

    使用dll创建cgi程序(181KB)

    在创建CGI程序时,DLL可以用于封装复杂的功能,例如数据库连接、加密解密等,使得CGI脚本能够调用这些功能而无需将所有代码都写在CGI脚本中。使用DLL的好处包括代码重用、减少内存占用和提高性能。在VB中,开发者...

    fcgiwrap, CGI脚本的简单FastCGI包装.zip

    fcgiwrap, CGI脚本的简单FastCGI包装 fcgiwrap信息:主页:作者:贡献者CGI脚本的简单FastCGI包装http://nginx.localdomain.pl/wiki/FcgiWrapGrzegorz Nosek &lt;root@localdom

    boa-cgi服务器

    这是因为CGI脚本通常是不持久的,每次请求都会生成一个新的实例。这虽然增加了服务器的开销,但在小型应用中,这种模式还是可以接受的。 在实际应用中,你需要为Boa配置CGI脚本的路径。例如,你可能在配置文件中...

    CGI 开发使用手册

    第6章 简单CGI脚本举例 第7章 编制脚本并设置Web服务器 第8章 修改CGI脚本 第9章 如何处理自定义图像映像 第10章 使用MIME 第四部分 使用CGI搜索引擎和数据库 第11章 为Web站点建立索引 第12章 使用WAIS与CGI 第13章...

    cgi.rar_CGI linux_cgi_cgi post_cgi post g_windows cgi post g

    这个压缩包中的“cgi”文件很可能是一个CGI脚本,可能使用Perl或C语言编写,展示了如何处理这两种请求类型。为了测试这个脚本,你需要在本地或者服务器上配置一个支持CGI的Web服务器,如Apache或Nginx,并将这个脚本...

    在ubuntu下为nginx配置支持cgi脚本的方案

    在nginx下支持cgi脚本于支持node类似的,只要在nginx直接做个转发,转发到对应的cgi套接字就好。 使用Fcgiwrap Fcgiqwrap是另外一个CGI封装库,跟Simple CGI类似。 安装fcgiwrap apt-get install fcgiwrap 安装以后...

    CGI开发使用手册

    内容翔实、材料丰富,从CGI的基本概念到复杂的CGI脚本的编写,循序渐进地引导读者成为CGI专家。从本书中读者可以学到如何开发CGI应用程序、创建搜索引擎、建立交互式HTML文档,编写数据库查询脚本、编写Web爬虫和...

    python实现的cgi

    在本例中,可能有一个名为`25_cgi.py`的文件,它就是我们的CGI脚本。 2. 脚本头部:CGI脚本需要告知Web服务器它是可执行的。在Python脚本中,我们通常添加`#!/usr/bin/env python3`作为第一行,告诉服务器使用...

    CGI教程 (HTM).rar

    4. **环境变量**:介绍CGI脚本中常见的环境变量,如REQUEST_METHOD、QUERY_STRING、CONTENT_TYPE和CONTENT_LENGTH,这些都是CGI脚本获取请求信息的关键。 5. **错误处理和日志记录**:讲解如何在CGI脚本中处理错误...

    BOA+CGI测试例程.rar_CGI arm_arm cgi_boa_boa cgi_cgi boa

    “ring.cgi”看起来是一个CGI脚本,可能是用来处理某种循环或者轮询操作的。在Web服务器中,CGI脚本通常用于接收HTTP请求,执行特定任务,然后返回结果。例如,这个脚本可能用于定期检查某些状态或执行周期性动作。 ...

Global site tag (gtag.js) - Google Analytics