cgi 订阅
公共网关接口(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、Java、VB 和Delphi 等。CGI分为标准CGI和间接CGI两种。标准CGI使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。间接CGI又称缓冲CGI,在CGI程序和CGI接口之间插入一个缓冲程序,缓冲程序与CGI接口间用标准输入输出进行通信 [1]  。 展开全文
公共网关接口(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、Java、VB 和Delphi 等。CGI分为标准CGI和间接CGI两种。标准CGI使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。间接CGI又称缓冲CGI,在CGI程序和CGI接口之间插入一个缓冲程序,缓冲程序与CGI接口间用标准输入输出进行通信 [1]  。
信息
外文名
Common Gateway Interface
类    别
标准CGI和间接CGI
定    义
Web 服务器运行时外部程序的规范
中文名
公共网关接口
功    能
用来解释处理来自表单的输入信息
学    科
计算机科学
CGI简介
CGI(Common Gateway Interface)公共网关接口,是外部扩展应用程序与 Web 服务器交互的一个标准接口。服务器端与客户端进行交互的常见方式多,CGI 技术就是其中之一。根据CGI标准,编写外部扩展应用程序,可以对客户端浏览器输入的数据进行处理,完成客户端与服务器的交互操作。CGI规范定义了Web服务器如何向扩展应用程序发送消息,在收到扩展应用程序的信息后又如何进行处理等内容。对于许多静态的HTML网页无法实现的功能,通过 CGI可以实现,比如表单的处理、对数据库的访问、搜索引擎、基于Web的数据库访问等等。使用CGI实现客户端与服务器的交互有以下几个标准步骤,具体步骤如下:(1)Web 客户端的浏览器将URL的第一部分解码与Web服务器相连。(2)Web 浏览器将URL的其余部分提供给服务器。(3)Web 服务器将URL转换成路径和文件名。(4)Web 服务器发送 HTML 和别的组成请求页面的文件给客户。一旦页面内容传送完,这个连接自动断开。(5)在客户端,HTML脚本提示用户做动作或输入。当用户响应后,客户请求Web服务器建立一个新的连接。(6)Web 服务器把这些信息和别的进程变量传送给由HTML以URL的形式指定CGI程序。(7)CGI 根据输入作出响应,把响应结果传送给 Web 服务器。(8)Web 服务器把响应的数据传给客户,完成后关闭连接。 [2]  服务器端 CGI 程序接收信息有三种途径:环境变量、命令行和标准输入。其中环境变量是指 CGI 定义一组环境变量,通过环境变量可传递数据。服务器收到来自浏览器的数据,调用 CGI 脚本,CGI 脚本将收到的数据转换成环境变量并从中取出所需要的内容。
标签的 METHOD 属性来决定具体使用哪一种方法。在“METHOD=GET”时,向 CGI 传递表单编码信息的是通过命令来进行的。表单编码信息大多数是通过环境变量 QUERY_STRING 来传递的。若“METHOD=POST”,表单信息通过标准输入来读取。还有一种不使用表单就可以向 CGI 传送信息的方法,那就是把信息直接附在 URL 地址后面,信息和URL 之间用问号(?)来进行分隔。GET 方法是对数据的一个请求,被用于获得静态文档。GET 方法通过将发送请求信息附加在 URL 后面的参数。当 GET 方法被使用时,CGI 程序将会从环境变量 QUERY_STRING获取数据。为了正确的响应客户端发来的请求,CGI 必须对 QUERY_STRING 中的字符串进行分析。当用户需要从服务器获取数据,但服务器上的数据不得改变时,应该用 GET 方法;但是如果请求中的字符串超过了一定长度,通常是 1024 字节,那么这时,只能用 POST 方法。POST 方法:浏览器将通过填写表单将数据传给服务器时一般采用POST 方法。在发送的数据超过 1024 字节时必须采用 POST 方法。当 POST 方法被使用时,Web 服务器向CGI 程序的标准输入 STDIN 传送数据。环境变量 CONTENT_LENGTH 存放着发送的数据长度。CGI 程序必须检查环境变量 REQUEST_METHOD 以确定有没有采用了 POST 方法,并决定是否要读取标准输入STDIN [3]  。
收起全文
精华内容
参与话题
问答
  • cgi

    千次阅读 2015-12-31 16:54:52
    cgi代码并不长,区分以下普通和文件的上传:x-www-form-urlencoded与multipart/form-data区别。 cgiGetenv(&cgiServerSoftware, (char*)"SERVER_SOFTWARE");//lighttpd/1.4.35 ---明显取得web

    备注:我最开始使用cgic;https://github.com/search?q=cgic中的https://github.com/boutell/cgic。但是在嵌入式cpu(400M)中,上传文件(上传文件用multipart/form-data才能正常获取)时非常慢,10M需要2分钟。后来换成cgicc-3.2.16就快很多,只要10秒。

    pc端cgic和cgicc都差不多,嵌入式端cgic中cgiParsePostMultipartInput运行太慢。

    在web端用F12也可以查看network:GET post的情况。cgi代码并不长,区分以下普通和文件的上传:x-www-form-urlencoded与multipart/form-data区别

       cgiGetenv(&cgiServerSoftware, (char*)"SERVER_SOFTWARE");//lighttpd/1.4.35        ---明显取得web服务器以及版本

        cgiGetenv(&cgiServerName, (char*)"SERVER_NAME");//192.168.59.254            ---域名
        cgiGetenv(&cgiGatewayInterface, (char*)"GATEWAY_INTERFACE");//CGI/1.1        ---CGI通用网关结构
        cgiGetenv(&cgiServerProtocol, (char*)"SERVER_PROTOCOL");//HTTP/1.1            ---服务器协议版本
        cgiGetenv(&cgiServerPort, (char*)"SERVER_PORT");//80                ---端口
        cgiGetenv(&cgiRequestMethod, (char*)"REQUEST_METHOD");//GET                ---web请求方法。GET,SET我也不是很熟
        cgiGetenv(&cgiPathInfo, (char*)"PATH_INFO");//NULL
        cgiGetenv(&cgiPathTranslated, (char*)"PATH_TRANSLATED");//NULL
        cgiGetenv(&cgiScriptName, (char*)"SCRIPT_NAME");///cgi-bin/login.cgi        ----调用的脚本名字
        cgiGetenv(&cgiQueryString, (char*)"QUERY_STRING");//NULL                ----请求的数据,如action=login&username=Administrator&password=WiDi
        cgiGetenv(&cgiRemoteHost, (char*)"REMOTE_HOST");//192.168.59.40            ----远端主机名
        cgiGetenv(&cgiRemoteAddr, (char*)"REMOTE_ADDR");//NULL
        cgiGetenv(&cgiAuthType, (char*)"AUTH_TYPE");//NULL
        cgiGetenv(&cgiRemoteUser, (char*)"REMOTE_USER");//NULL
        cgiGetenv(&cgiRemoteIdent, (char*)"REMOTE_IDENT");//NULL
    ............................................................
        cgiGetenv(&cgiContentLengthString, (char*)"CONTENT_LENGTH");//0            ---访问时内容长度
        cgiContentLength = atoi(cgiContentLengthString);
        cgiGetenv(&cgiAccept, (char*)"HTTP_ACCEPT");//text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8    ---应该是可以接收的格式。html,xhtml,xml(猜的)。
        cgiGetenv(&cgiUserAgent, (char*)"HTTP_USER_AGENT");//Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0        ---访问代理Firefox
        cgiGetenv(&cgiReferrer, (char*)"HTTP_REFERER");//http://192.168.59.254/index.html    ---web访问的地址
        cgiGetenv(&cgiCookie, (char*)"HTTP_COOKIE");//lang=English; SESSIONID=E85F333900B0B4586A0E25A1CC9B0A21        ---与web端会话ID

    对应输出结果:
    SERVER_SOFTWARE==lighttpd/1.4.35
    SERVER_NAME==192.168.59.254
    GATEWAY_INTERFACE==CGI/1.1
    SERVER_PROTOCOL==HTTP/1.1
    SERVER_PORT==80
    REQUEST_METHOD==GET
    SCRIPT_NAME==/cgi-bin/login.cgi
    REMOTE_ADDR==192.168.59.40
    CONTENT_LENGTH==0
    HTTP_ACCEPT==text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    HTTP_USER_AGENT==Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0
    HTTP_REFERER==http://192.168.59.254/index.html
    HTTP_COOKIE==lang=English; SESSIONID=E85F333900B0B4586A0E25A1CC9B0A21
    Web session invalid

    如果REQUEST_METHOD==POST说明是设置命令如:SET http://localhost/Jack/cgi-bin/out.cgi?theText=it%27s+me
    其中theText是html/javascript中定义的输入接口名称。it%27s+me为输入的内容。
    对应函数:cgiParseFormInput
    typedef struct cgiFormEntryStruct {
            char *attr;//属性名,html中定义的,保存在这里POST上传
        /* value is populated for regular form fields only.
            For file uploads, it points to an empty string, and file
            upload data should be read from the file tfileName. */
        char *value;//对应的数据
        /* When fileName is not an empty string, tfileName is not null,
            and 'value' points to an empty string. */
        /* Valid for both files and regular fields; does not include
            terminating null of regular fields. */
        int valueLength;//数据长度
        char *fileName;    
        char *contentType;
        /* Temporary file name for working storage of file uploads. */
        char *tfileName;
            struct cgiFormEntryStruct *next;//下一个组上传属性。表头cgiFormEntryFirst
    } cgiFormEntry;

    cgiStrEqNc判断字符串相等。
    cgiParsePostFormInput从cgin读取数据并解析POST到表头cgiFormEntryFirst
    cgiParseGetFormInput从cgiQueryString解析数据到cgiFormEntryFirst
    cgiCookies用来提取cgiCookie中如:lang和SESSIONID的名字--不是value
    get_cgi_session_id这是用户层代码了,用来查看cgiCookie中是否有SESSIONID信息。

    cgiHeaderCookieSetString设置cookie,作用举例:如果有效期过了,可以退到登陆界面

     

    CGI页面跳转: CGI实现HTML页面跳转的几种方式

    https://blog.csdn.net/qq_31776303/article/details/91986751

    CGI操作Session:

    https://blog.csdn.net/marysa/article/details/24252407

    https://blog.csdn.net/gerryzhu/article/details/5417023

    CSS:

    https://www.cnblogs.com/dongh/p/9584962.html

    展开全文
  • CGI

    2019-08-01 12:00:25
    在写程序之前,我们要先搭建一个web服务器,好在Python3.x自带了一个cgi服务器,现在我们将它跑起来; 首先,在你的电脑里找一个目录,新建一个文件夹,叫做“www”,在“www”文件夹下面新建一个目录,叫做“cgi-...

    先搭建一个web服务器,好在Python3.x自带了一个cgi服务器;

    1. 在d盘新建一个文件夹,叫做“www”,在“www”文件夹下面新建一个目录,叫做“cgi-bin”,存放cgi程序

    2. 使用管理员打开cmd命令行工具,进入到“www”目录下,

    3. 敲命令“python -m http.server --cgi 8001”将服务器开启,注意:8001是端口可以随意指定的,打开正确后显示如下的界面,如果不正确,多半是端口有冲突了,换一个端口就可以了;
      在这里插入图片描述

    4. 打开浏览器,在浏览器里输入如下图所示的地址

    ,敲回车访问,如果弹出来如下的页面,就表示服务器已经正常工作了:

    在这里插入图片描述
    5 .新建一个文件夹web编写html代码
    访问html页面
    在这里插入图片描述
    6.在cgi-bin下编辑代码hello.py,访问hello.py
    在这里插入图片描述
    中文乱码问题:
    加上sys.stdout = codecs.getwriter(‘utf-8’)(sys.stdout.buffer)
    在这里插入图片描述
    参考: 菜鸟教程

    展开全文
  • cgi

    2010-03-22 16:41:00
    cgi学习简明教程阅览次数: 文章来源: CP整理 原文作者: 不详 整理日期: 2006-10-05 发表评论 字体大小: 小 中 大 第一章:基础的基础CGI/PERL学习 1.1 为什么使用CGI? 我没有把什么是CGI放在基础篇的第一段,...

    cgi学习简明教程
    阅览次数:
    文章来源: CP整理
    原文作者: 不详
    整理日期: 2006-10-05
    发表评论
    字体大小: 小
     中
     大
     
    第一章:基础的基础CGI/PERL学习

        1.1 为什么使用CGI?

        我没有把什么是CGI放在基础篇的第一段,是因为实在很难说明白到底什么是CGI.

        而如果你先知道CGI有什么作用,将会很好的理解CGI是什么这个概念。 CGI可以为我们

        提供许多HTML无法做到的功能。比如a.一个记数器; b.顾客信息表格的提交以及统计;

        c.搜索程序;d.WEB数据库等等。

        用Html是没有办法记住客户的任何信息的,就算用户愿意让你知道。用Html也是无法

        把信息记录到某一个特定文件里的。要把客户段的信息记录在服务器的硬盘上,就要用到

        CGI. 这是CGI最重要的作用,它补充了Html的不足。是的,仅仅是补充,不是替代。

        1.2 CGI是什么?

        好了,现在我们来说到底什么是CGI.Common Gate Intergace听起来让人有些专业,

        我们就管它叫CGI好了。在物理上,CGI是一段程序,它运行在Server上,提供同客户段

        Html页面的接口。这样说大概还不好理解。那么我们看一个实际例子: 现在的个人主页

        上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户段输入一些信息,

        如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端),浏览器把

        这些信息传送到服务器的cgi目录下特定的cgi程序中,于是cgi程序在服务器上按照预定

        的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后cgi程序给客

        户端发送一个信息,表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”

        的字样。整个过程结束。

        1.3 选择你熟悉的编程语言

        既然CGI是一种程序,自然需要用编程语言来写。你可以用任何一种你熟悉的高级语言,

        C,C++,C shell和VB.值得特别指出的,有一种叫Perl的语言。其前身是属于Unix专用的

        高级语言,其具有强大的字符串处理能力而成为现在写CGI,特别是表单类程序的首选。最

        近它已经有了Window95,和winnt版本。你可以在搜索程序里找到在那里下载它。 VB是Ms

        的杀手锏,从目前的情况看,微软公司正试图使VB无所不能。自然也包括在Internet 请各

        位注意,VB开发的程序只能在windows平台上被执行,所以它有一定局限。 C Shell,经典

        的语言。可惜能做的事情不多,而且必须在Unix平台下。 C,C++,正真的无所不能。可是

        在写CGI的时候显得非常难以掌握。特别是缺乏可以灵活使用的字符串处理函数。对程序员

        的要求也比较高,维护复杂。 最后要提醒各位,因为CGI是Server和Clinet的接口,所以

        对于不同的Server,CGI程序的移值是一个很复杂的问题。一般对于不同的Server,决没有

        两个可以互相通用的CGI.实际上 这就是CGI程序最复杂的地方。

        1.4 安全

        我想各位敏感的朋友又要问我关于安全性能的问题了。实际上CGI是比较安全的,至少

        比那些没有数字签名的ActiveX控件要安全的多。除非你有意在程序里加入了破坏Server的

        命令, 否则一般不会有什么严重的后果。而个人网站不向大众开放CGI目录,则因为怕各位

        学习不精,无端增加服务器的负担,所以一般不提供。

        小结:本章讲述了CGI基本概念,也说明了各种编程语言的优缺点,同时解释了为什么个人

        网站不提供CGI的原因。接下来我们开始正式学习。


    第二章 Html的表单基础知识

        组成Cgi程序的是两部分,一部分是html页面,就是用户看到的东西。另一部分则是运

        行在服务器上的程序。一般来说,我们先写html页面,再写程序。所以我们的学习页是这样,

        先看看表单的写法,再去学习CGI程序。

        对于html的表单,有比较复杂和详细的规定。但由于它们是属于html标准里的东西,所

        以我不打算详细讲解。最好是你自己找本书看看。

        Html表单

        <Form></Form>标记把输入域组合起来,并且说明了表单提交的方式和地点。Form标签有许

        多属性,比如NAME等等。具体的属性,将在使用的时候说明。

        在FORM里还有许多不同的标签,正是它们组成了表单的各种成分。

        <INPUT [TYPE=TEXT] NAME="TEXT-ID" [SIZE=NN] [MAXLENGTH=NN]

        [VALUE='DEFAULT TEXT']>

        该语句在HTML里产生一个文本标签,[]里表示该属性是可选的。

        <INPUT TYPE=SUBMIT [NAME='BUTTON-ID'][VALUE="BUTTON LABLE TEXT"]>

        该语句产生一个提交按键,用于表单的提交。它提供一个发送表单的按纽,信息发向<FORM>

        标记里ACTION属性里给出的URL.根据表单方法(METHOD)指定的HTTP请求类型 提交信息。

        在以后我将详细讲解。

        <INPUT TYPE=RESET[VALUE='BUTTON LABEL TEXT']>

        具有TYPE=RESET属性的INPUT将产生一个按钮,它能重置表单各个域 的内容到初始状态。

        <INPUT TYPE=RADIO NAME="RADIO-SET -ID" vALUE="CHOICE-ID" [CHECKED]>

        表单可以用此标记提示用户从几个选择项里作出选择。么个选择项目都是一个单选按钮它们

        具有相同的NAME值。在任何时候只要有一个被选中。此标记有一个VALUE属性,如果它被选

        中,则发送表单时将以"RADIO-SET-ID=CHOICE-ID"的形式发送。

        <INPUT TYPE=CHECKBOX NAME='BOX-SET-ID' VALUE='CHOICE-ID' [CHECKED]>

        此标签将产生一个'OFF'或'ON'的开关。它同RADIO相似,但是可以多选。当提交表单的时候如

        果一个复选框是选中的饿,那么它的VALUE属性作为BOX-SET-ID表单数据的值被提交。几个

        拥有同样NAME属性的复选框为一组。它们用','分开的列表。




    第三章:传送方式 CGI/PERL学习

        传送方法:

        所谓方法是指调用CGI程序的途径。事实上,要执行程序时,你用一种方法向服务器提

        出请求,此请求定义了程序如何接受数据。 下面介绍最常用的两种方法:get和post

        1.GET 当使用这种方法时,CGI程序从环境变量QUERY_STRING获取数据。QUERY_STRING被

        称为环境变量,就是这种环境变量把客户端的数据传给服务器。为了解释和执行程序,CGI

        必须要分析(处理)此字符串。当你想从服务器获得数据并且不改变服务器上的数据时,

        你应该选用GET.但如果你的字符串长度超过了一定长度,那么还是选用POST方法。

        2.POST 使用POST方法时,WEB服务器通过stdin(标准输入),向CGI程序传送数据。服务

        器在数据的最后没有使用EOF字符标记,因此程序为了正确的读取stdin,必须使用

        CONTENT_LENGTH .当你发送的数据将改变Web服务器端的数据或者你想给CGI程序传送的数

        据超过了1024 字节,这是url的极限长度,你应该使用post方法。

        3.实现方法:

        上次讲过html中的<Form>标签,对于传送数据方法的定义也在这个标签里定义。 如下:

        <form name="guyi's form" action=http://www.yourname.com/cgi/your.cgi method=GET>

        定义了一个以get方法传送数据的form,它的服务端程序是http://www.yourname.com/cgi/your.cgi.

        同样的如下的定义将使用post方法。

        <form method=post>




    第四章:基本调试环境的建立

        基本调试环境的建立:

        我想不是每个阅读教程的朋友有机会接触到服务器之类的东西的。所以在接下去的阅

        读过程中没有调试环境的朋友将会非常吃力。为了解决这个问题,我特别介绍一种在

        win95或nt上建立WEB SITE的方法,以便各位能很好的阅读程序。不过本方法内使用的软

        件都比较大,如果你不是一个真正的网络发烧友,或许你会放弃这个教程。这个我也没

        有办法,要知道喜欢一样东西总是要付出代价的。

        1.win95&winnt的Server软件:

        首先我要各位弄清楚一个概念,所谓Sever只是指在一台电脑上安装了一个特别的软件。

        该软件可以提供internet web site服务。这台电脑不一定要是什么特别好的机器,只要它

        能够很好的运行Server软件就可以了。比如我们的个人电脑就可以承担这个任务。 在

        Windows95下运行的server软件不是很多,而且是属于“业余”的。就是说离真正的商业使

        用有很大的距离。这主要是windows95平台的局限,比如很差的安全性,不稳定的内存分配

        系统,混乱的文件系统以及最差的进程管理。不过这些不影响我们使用CGI程序,特别是一

        个人调试自己的程序,而不是放在internet给数万个人访问。其代表是MS在windows OSR离

        提供的pws(person web server)。你可以通过控制面版——>网络——>服务——>Ms——>个人WEB服

        务器安装它。不过我希望你们最好还是不要使用这个东西,因为它对我们下面的课程没有什

        么帮助。我曾试验过用它来和我的perl程序相连,但很显然不支持perl.虽然有消息说修改

        注册表可以解决这个问题,但我到现在还是没有找到方法。相对而言,Windows NT因为其定

        位的不同而可以提供较理想的操作平台。而且NT自带有IIS(Internet Information Server)。

        不过是2.0版的,如果你有IIS3.0就更好了。到本文写成的时候,IIS已经有了4.0版本。当

        然我相信不是所有人会去下载这个东西,因为有 104M.

        上面讲了这么多,实际上我要给各位推荐的是WebSite for win95&NT.就是说两个操作

        系统都可以使用它。现在的版本是2.1,有17M.显然是一个很大的软件,不过正如我说的,

        喜欢一样东西是有代价的。你可以在http://www.windows95.com 里找到这个程序。 WebSite

        支持winCGI,也支持perl写的CGI程序。显然这是一个好东西,可以满足我们的要求。虽然

        大了些,不过要是你能找到website 1.1的话也不错,它大概有4M左右。不过我在网上从没

        发现有下载的地方。

        2.Perl for win32

        Perl,让人激动的名字。我想再也找不到一个编程语言可以如此出色的完成基本CGI程序

        的开发了。我感谢那些为perl移植做出贡献的朋友们,是他们让我们可以在win平台上使用如

        此如此强大的Unix工具。 你可以在perl的主页上找到perl for win32版本,当前版本是5.02.

        你也可以在 http://download.ihw.com.cn 里找到perl for win32版本。大概是2.5M.

        3.VB

        VB是我们写WinCGI程序最好的选择。我推荐各位使用vb4.不是因为vb5不好,只是在

        Internet上支持它的文档和免费代码太少了。

        4.C&C++

        这个教程里几乎没有用C&C++写的代码,因为它更适合高级程序员而不是我们这些业余

        选手。不过你要是一定使用它我也没有意见。

        5.安装。

        好了,我们开始建立基本环境。就是说我们要在自己的机器上建立一个WEB SITE! 首

        先安装Website.按照它标准的安装界面,你可以轻松的完成这个工作。缺省情况下它将

        被安装到c:website下。我提醒各位注意这几个目录:

        cgi-shl:这个是基本的cgi目录,也就是各位朝思暮想的地方!

        cgi-win:这个cgi目录里放的是WinCgi程序。 其他的各位自己研究吧。

        好了,在装完Website后请确认它已经运行。在状态拦地右下角会有一个齿轮地图标,

        它表示website正在运行。接下去请打开你地浏览器,在url输入你机器的ip地址,如果没

        有 ip,请输入:127.0.0.1.注意,做这些动作的时候,最好请你使用netscape,而且你

        不必连上网络! 如果一切顺利的话,你将看到website的标记,那证明你已经成功了!

        接下去我们安装perl. 下载后的perl是一个自解开文件,它会问你安装到哪个目录。缺省

        是c:perl,接着它展开并产生几个自目录。在安装结束的时候,它会修改autoexec.bat,

        把c:perlbin加如 path,请一定要这么做,道理我会在下面解释。最后请随便写一个以

        。cgi或。pl结尾的文本文件。直接双击它,并为它加上关联。。pl或 .cgi的关联文件是

        c:perlbinperl.exe.这步很重要,不然你无法完成接下去的学习。 那么为什么我们

        要加路径呢?因为perl是一种文本解释型语言,就是说它没有编译的过程, 只有在运行

        的时候解释。解释一句运行一句。所以我们必须让系统知道perl.exe在哪里。

        6.测试

        最后我们进行一个测试。请把下面的两个程序下载并运行它们:

        1.html文件:这是测试程序的客户端内容,请以test.htm保存它。并把它放在

        c:websitehotdocs 下,那是你的website缺省的根目录。

        test.htm:

        <html> <title>你的第一个perl测试程序</title> <body> <h1>你的第一个perl测试程序<h1><br> <h2>win 平台的环境变量测试</h2><br> <form method="get" acton="http://127.0.0.1/cgi-shl/env.pl "> <input type=submit value="查看CGI环境变量"> </form> </body> </html>

        2.Perl文件:请使用任意一个文本编辑器,输入后以env.pl保存到c:websitecgi-shl下。

        #! perl

        print"Content-type:text/htmlnn";print"<title>Windows环境变量</title>";print"<body>恭喜你的website已经成功<br>";foreach $key(sort keys %ENV){ print"$key=$ENV{$key}<br>"; } PRINT"</BODY>";

        在完成上面的工作后,请打开浏览器,输入http://127.0.0.1/test.htm.当然如果你的

        机器是以tcp/ip方式 连在局域网上,请把127.0.0.1改成你的ip地址(还有test.htm里的。)

        然后按下那个键,当你的浏览器去向另一个 页面的时候,今天的任务就算是完成了。





    第五章:第一个程序--环境变量CGI/PERL学习

       服务器与CGI程序交换信息的协作方式是通过环境变量实现的。无论什么请求,CGI程序总能在特定位置找到某些信息。无论环境变量怎样定义,总有一些变量有着特定含义。环境变量是一个保存用户信息的内存区。例如,所有的机器都有一个PATH环境变量,当在当前目录找布道文件时就要查找PATH变量。当服务器收到一个请求后,它首先要收集它能得到的所有相关信息,并把它放入内存。那么,服务器要收集什么信息呢?

        关于服务器自身的详细信息

        关于用户的信息信息

        关于用户请求的信息

        服务器不知道CGI程序到底需要那些信息,所以它把这些信息一起收集,那么如果有什么重要的东西就不会遗漏了。为了向你展示服务器收集那些环境变量,在上一期的教程里我已经为各位写了一个程序,该程序将几乎所有的信息都反映在了浏览器里。所以在进一步学习变量的时候,请首先把程序调试好。

        环境变量

        1.与服务器相关的环境变量

    GATEWAY_INTERFACE 服务器遵守的CGI版本
    SERVER_NAME 服务器的IP或名字
    SERVER_PORT 主机的端口号
    SERVER_SOFTWARE 服务器软件的名字


        2.与客户机相关的环境变量

        服务器了解你的CGI程序,但它一定不知道你的客户机环境。正因为如此,同客户机有

        关的变量才是最重要的。因为它涉及到你的浏览器等等。

    ACCEPT 例出能被次请求接受的应答方式
    ACCEPT_ENCODING 列出客户机支持的编码方式
    ACCEPT_LANGUAGE 表明客户机可接受语言的ISO代码
    AUTORIZATION 表明被证实了的用户
    FORM 列出客户机的EMAIL地址
    IF_MODIFIED_SINGCE 当用get方式请求并且只有当文档比指定日期更早时才返回数据
    PRAGMA 设定将来要用到的服务器代理
    REFFERER 指出连接到当前文档的文档的URL
    USER_AGENT 标明客户使用的软件


        3.与请求相关的环境变量

        每次服务器受到的请求都不可能是一样的。这意味着有许多CGI程序必须注意的信息。这些与请求相关的信息包含有用户调用的信息,用户如何发送请求,以及作为请求的一部分传送了多少(什么)信息。这些对你的程序来说是非常重要的,因此我们将化些时间详细地讨论一下其中的一些变量。特别是下面写出的三个变量。这三个变量相当重要。

        REQUEST_METHOD

        QUERY_STRING

        CONTENT_LENGTH

        你必须熟悉这三个变量,因为它们用来表示数据是如何送到CGI程序的;然后你所要要做的事情就是在这三个变量里取出数据,进行下一步的编程。其他的一些变量的用处很多,

        你可以了解你的竞争对手正在调用你的程序,你可以辨别用户是否注册,或者你可以设置连接到你的CGI程序以便要求附加路径信息包含在请求之中——因此你不必猜测你的用户正在你的服务器的哪个页面上。

    AUTH_TYPE 服务器用的确认模式
    CONTENT_FILE 含有CGI程序的数据文件
    CONTENT_LENGTH POST请求中向标准输入(STDIN)发送的字节数
    CONTENT_TYPE 被发送数据的类型
    PATH_INFO CGI程序的附加路径
    PATH_TRANSLATED PATH_INFO对应的绝对路径
    QUERY_STRING 传送给CGI程序的URL的问号(?)之后的那一部分
    REMOTE_ADDR 最终用户的IP或主机名
    REMOTE_USER 如果用户合法,则是用户的组名
    REQUEST_LINE 发送给服务器的完整URL请求
    REQUEST_METHOD 作为HTTP的一部分请求而传送数据的方法,比如get。
    SCRPT_NAME 运行的脚本名字





    第六章: 调查表CGI/PERL学习

        对于本章的程序——选票程序,我不想多说什么。我只是想在本程序内教给大家如何

        使用perl语言或C语言如何处理字符串的实例。让我们先看看代码:

        页面文件——pote.html

        <HTML>

        <TITLE>投票程序</TITLE>

        <h1>投票程序</h1>

        <FORM METHOD="post" ACTION="/cgi-bin/vote.pl">

        一。你喜欢谁?<br>

        <input type="radio" name="idol" value="A" checked>张德陪<br>

        <input type="radio" name="idol" value="B">阿加西<br>

        <input type="radio" name="idol" value="C">桑普拉斯<br>

        <input type="radio" name="idol" value="D">贝克<br>

        <input type="radio" name="idol" value="D">顾懿<br>

        <input type="submit" value="执行">

        <input type="reset" value="取消">

        </form>

        查询<a href="/cgi-bin/vote.pl?command=view">选举投票结果</a>

        </html>

        CGI程序:——vote.pl

        #!perl

        print"Content-type:text/htmlnn";

        print"<titel>投票系统</title>";

        if($ENV{'REQUEST_METHOD'}eq"POST"){

        read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});

        }elsif($ENV{'REQUEST_METHOD'}eq"GET"){

        $buffer=$ENV{'QUERY_STIRNG'};

        }

        @pairs=split(/&/,$buffer);

        foreach $pair(@pairs){

        ($name,$value)=split(/=/,$pair);

        $value=~tr/+//;

        $value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;

        $FORM{$name}=$value;}

        $filename="/vote.dat";

        %NAME=("A","张德陪","B","阿加西","C","桑普拉斯","D","贝克","E","顾懿");

        if($ENV{'REQUEST_METHOD'}eq"POST"){

        print"Content-type:text/htmlnn";

        print"<titel>投票系统</title>";

        print"<h1>投票系统的例子</h1>";

        open(FILE,"<$filename")||die"不能打开文件,请和管理员联系n";

        for($i=0;$i<2;$i++){

        $file[$i]=<FILE>;

        $file[$i]=~s/n$//;

        }

        close(FILE);

        @item=split(/:/,$file[0]);

        @vote=split(/:/,$file[1]);

        for($i=0;$i<@item;$i++){

        if($FORM{'idol'}eq$item[$i]){

        $vote[$i]++;

        last;

        }

        }

        open(FILE,">filename")||die"Can't Open the file";

        $item=join(":",@item);

        $vote=join(":",@vote);

        pirnt FILE "$itemn";

        print FILE "$voten";

        close (FILE);

        print"<h2>您是投票给$NAME{$FORM{'idol'}},谢谢您的选票!<h2>";

        print"查询<a href="/cgi-bin/vote.pl?command=viem">投票结果系统</a>";

        }

        if($FORM{'command'}eq"view"){

        print "HTTP/1.0 200n";

        print "Content-type:text/htmlnn";

        print"<title>投票结果</title>";

        print"<h1>投票结果</h1>";

        open (FILE,"$filename")||die"文件打开错误";

        for($i=0;$i<2;$i++){

        $file[$i]=<FILE>;

        $file[$i]=~s/n$//;

        }

        close(FILE);

        @item=split(/:/,$file[0]);

        @vote=split(/:/,$file[1]);

        print"<table border=1>";

        for($i=0;$i<@item;$i++){

        print"<tr><td>姓名</td><td>$NAME{$item[$i]}</td><td>票数</td>,td>$vote[$i]

        </td><tr>";

        }

        print "</table>";

        }

        这个程序是要各位学习Perl的分解字符串的功能。在Perl中,字符串操作

        是非常简单的。

        我对几句重要语句做一个分析:

        if($ENV{'REQUEST_METHOD'}eq"POST"){

        read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});

        }elsif($ENV{'REQUEST_METHOD'}eq"GET"){

        $buffer=$ENV{'QUERY_STIRNG'};

        }

        这是一个非常常见的功能块,几乎所有的CGI程序都会用到它。它判断

        页面使用何种方式提交变量。如果是post,就从STDIN里把变量读出,存到

        变量buffer里。注意在perl里,变量是用$开头的。而$ENV{'CONTENT_LENGTH'}

        则是读出该变量的长度,请注意CONTENT_LENGTH是一个环境变量。第二个if则

        处理get情况,在get情况下,页面提交的信息是存放在环境变量QUERY_STIRNG中

        的。所以$buffer也就是页面提交的信息。环境变量REQUEST_METHOD表示方式,

        它的值是一个字符串,前面加上$ENV则表示读出该变量的值。

        @pairs=split(/&/,$buffer);

        foreach $pair(@pairs){

        ($name,$value)=split(/=/,$pair);

        $value=~tr/+//;

        $value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;

        $FORM{$name}=$value;}

        以上功能块是一个分解过程。页面信息的提交往往是以“名称=值”的形式,

        比如本例子中就是以“idol=顾懿”这样的形式提交的,所以我们要去掉字符串中

        的"="等等信息,但同时要保留“idol”和"顾懿"之间的对应关系。$FORM{$name}

        =$value做到这一点,这是一个关联数组。具体其中的语法,请各位自行查书。接

        下来的就是文件的操作,但那已经不是本课的重点。所以就不多说了。




    第七章:上传文件

       上传文件是建立交互式网站的一个重要手段。一般来说,考虑到CGI程序的安全和一些敏感问题,服务器是不会轻易开放文件上传权利的。

        今天的程序是由WEBSITE1.1附带的一个upload.exe程序,由VB编写而成。所以我要讲的也就是VB写WIN-CGI时候的一些问题。

        VB写Win-CGI:

        在Windows环境下,WEB服务器和一个Windows CGI之间是通过临时文件来传送数据的。这个

        过程如下:

        1.Web服务器接受一个客户机对Windows CGI程序的请求,这个请求也称为Windows CGI请求。

        2.Web服务器把要传送给Windows CGI程序的数据放在一个叫CGI profile的主输入文件。在某些情况下,还会增加一个文件。

        3.Web服务器执行CGI程序,把CGI profile作为它的第一个参数。

        4.Windows CGI开始执行,服务器等待Windows CGI进程结束。在等待过程中,服务器还可以处理其他请求,比如另一个新的CGI进程或HTTP请求。

        5.Windows CGI程序读取作为命令行参数的profile文件并完成必要的处理,CGI程序也许要使用porfile文件中的数据和其他相关的辅助文件中的数据。

        6.在Windows CGI程序结束前,把它的应答写在profile文件指定的输出文件中。

        7.得到CGI程序处理结果后,WEB服务器读取输出文件,看看输出数据是否要打包,并把最后数据发给客户机。

        8.WEB服务器随后就删除处理这个请求时产生的临时文件。如果在服务器管理器注册时,不删除临时文件,则保留这些临时文件。总的说,基于文件的传输过程是比较古老的。但它是最常用的通讯方式。

        CGI32.BAS

        CGI32.BAS是给windows系列的使用者在VB4.0或更高的环境下开发Windows-cgi而写的一

        个程序接口。本文假设你已经对VB编程非常熟悉,所以对于使用VB的过程我就省略不说了。

        在写Win-CGI程序的时候,请将VB环境中的有效对象全部关掉(Custom controls),并将

        CGI32.bas加入project中。随后创建一个子程序

        CGI_Main()

        Sub CGI-Main()

        'Win-CGI程序内容end sub

        对于CGI32.bas,如果你还没有,请在这里下载。

        Sub Main()

        On Error GoTo ErrorHandler

        If Trim$(Command$) = "" Then ' Interactive start Inter_Main ' Call interactive main Exit Sub ' Exit the program End If

        InitializeCGI ' Create the CGI environment

        '=========== CGI_Main ' Execute the actual "script" '===========

        Cleanup:Close #CGI_OutputFN Exit Sub ' End the program '——ErrorHandler:Select Case Err ' Decode our "user defined" errors Case ERR_NO_FIELD:ErrorString = "Unknown form field" Case Else:ErrorString = Error$ ' Must be VB error End Select

        ErrorString = ErrorString & " (error #" & Err & ")" On Error GoTo 0 ' Prevent recursion ErrorHandler (Err) ' Generate HTTP error result Resume Cleanup '——End Sub

        上面是一个Win-cgi的例子。




    第八章:Form to MailCGI/PERL学习

        Form to Mail

        所谓Form to Mail的功能,就是在页面上建立一个表单(form),该表单内记录着用户的信息,当用户提交了此表单,程序自动将表单内容发送的管理员所设定的信箱里。听起来这非常简单,根本用CGI就可以写这样的功能。其实当然没有这么简单,实际上许多公司网页还要求此表单在提交时存如另一个数据库,这样就需要写CGI程序了。

        为了便于解说form to mail的功能,我们这里不考虑复杂情况,只考虑最简单的情况。就是唯一的form to mail功能,其他的功能只要在程序内加入相应的程序块就可以了。

        在Unix中,我们最多使用的就是Email网关,因为是CGI开发环境中少数几个标准unix工具之一。在CGI程序中发送e-mail的命令是mail和Sendmail.我比较喜欢sendmail,因为它功能更强,Sendmail从STDIN接受数据,遇到Eof或只包含。的一行信息就将信息发送出去。

        Perl中使用Sendmail的一个方式是将mail内容写入一个临时文件,然后使用Cat,同时把输出管道与Sendmail命令相联系起来。

        如:

        open(EMAIL,“>tempfile $ $,txt”);

        print(EMAIL,“stuff to be emailed …… la la la ……n”);

        close(EMAIL);

        system(“cat tempfile $ $,txt | /usr/sbin/sendmail $tokens(‘email’)”);

        system(“rm tempfile $ $,txt”);

        名字tempfile $$,txt中的$ $是Perl中的一个特殊变量,即进程号(PID)。之所以使用是为了避免两个用户同时启动这个程序会覆盖tempfile文件,使用这种方法每个tempfile都是唯一的。(由pid表示)。这种好的思想可以用在许多程序中。

        Sendmail命令从关联数组元素$token(‘email’)中找到e-mail目标地址,你可以假设这个变量的值在用户提交的表单由用户输入。如果没有安全措施,这样做是很危险的,设想有恶意的用户在Web表单中给你如下地址:Noone@nowhere.net ;cd/;rm-R *分号是表示unix命令结束的符号并将命令提交unix命令解释器。精通web的人谁也不会在根目录运行httpd,这个例子将删除整个文件系统。所以在设计整个系统的时候,必须考虑到这种用户直接到达Shell的情况。

        Windows 下的Form to Mail

        很不幸,Windows没有类似于Unix的mail网关,不管是WinNt和Windows都无法做到类似的功能。当然也有些非常热心的程序员写过Dos接口的mail程序,但是相当不幸,此类程序直到现在也没有很成功的例子。它们的问题是过于占用系统资源,并非常容易被黑客攻击。所以这里我就不提供程序了。




    第九章:Guest book

        Guest-book在网页设计中占有相当重要的地位,以至于可以和记数器相提并论。留言本可以用许多编程语言来设计,当然使用最多的还是perl和vb两种。本次cgi教程我们将谈谈在编写Guest-book中最应该注意的问题,并将给出一个不算很完整的程序代码。同时提供一个C语言的win-cgi程序供大家下载。

        就现在的情况来看,一个标准的guest-book程序一般包括三个文件。提交表单文件(form.html)、cgi处理文件(guest-book.cgi)和最后的输出文件(book.html)。有些vb程序以access数据库为后台存储格式,以方便用户查找留言。下图给出了guest-book的工作流程。

        form.html首先我们来看看form.html的文件内容:<html> <title>guest-book.html</title> <h1>留言本</h1> <form method="post" action="/cgi-shl/guest-book.cgi"> <p>名字:<input name="name" size="20"> <p>email:<input name="email" size="30"> <p>意见:<textarea name="suggest" cols=30 rows=4></textarea> </textarea><p> <input type="submit" value="提交"> <input type="reset" value="取消"> </form></html>

        <form method="post" action="/cgi-shl/guest-book.cgi">将此表单的提交后的动作交给guest-book.cgi程序。

        guest-book.cgi #! perl

        print"Content-type:text/htmlnn";read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});@pairs=split(/&/,$buffer);foreach $pair(@pairs){($name,$value)=split(/=/,$pair);$value=~tr/+//;$value=~s/%([a-f A-F 0-9][a-f A-F 0-9])/pack("C",hex($1))/eg;$FORM{$name}=$value;} print"<title>留言本</title>";print"<h1>留言本</h1>";

        foreach $check(values%FORM){ if($check eq""){ print"<hr size=3>";print"<h2>请不要留空";exit(0);}

        $FORM{'suggest'}=~s/cMn/<br>n/g;

        $filename="c:/website/htdocs/book.html";

        open(FILE,">> $filename");print FILE "名字:$FORM{'name'}<br>n";print FILE "Email:<a href="mailto:$FORM{'email'}>$FORM{'email'}</a><br>n"}";print FILE "留言:$FORM{'suggest'}";close{FILE};

        print "<h2>谢谢留言</h2>";

        print"<a href="book.html">请观看留言本</a>";

        exit(0);

        这个程序相当简陋,但它具有了所有的CGI-Guest程序的特点,我们一一分析如下:首先,read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});@pairs=split(/&/,$buffer);foreach $pair(@pairs){($name,$value)=split(/=/,$pair);$value=~tr/+//;$value=~s/%([a-f A-F 0-9][a-f A-F 0-9])/pack("C",hex($1))/eg;$FORM{$name}=$value;}这是一段表单分析的语句,在前面的程序里,估计大家也都见过了。

        其次:foreach $check(values%FORM){ if($check eq""){ print"<hr size=3>";print"<h2>请不要留空";exit(0);}做输入字段的检查,看看是否有留空的现象。从前这种任务都是要CGI程序来验证的,比如

        email是否输入的是mail地址等检查。不过现在我们可以通过javascript来做这样的检查,

        这样服务器的负担将大大减轻。

        最后:$filename="c:/website/htdocs/book.html";

        open(FILE,">> $filename");print FILE "名字:$FORM{'name'}<br>n";print FILE "Email:<a href="mailto:$FORM{'email'}>$FORM{'email'}</a><br>n"}";print FILE "留言:$FORM{'suggest'}";close{FILE};

        print "<h2>谢谢留言</h2>";

        print"<a href="book.html">请观看留言本</a>";

        exit(0);输出内容到文件和屏幕上。完成留言的程序。

        book.html:这个程序中book.html没有什么特别的要求,可以不用写,就让程序自动生成。

        现在有的cgi程序,对book.html也有设定,比如在<head></head>之间就写上注释<!——这是流言开始——!> <!——这是流言结束——!>这样,在程序对留言数据操作的时候,就可以忽略掉文件内的其他内容。

        最后,我为各位找到一个用C写的guestbook程序,它是在win平台上运行的,具有非常好的兼容性。同时它采用了临时文件的方式来传递信息。所以你需要设定。ini文件。好了,这课到此为止。




    第十章:一个数据库的例子

       毫无疑问,当今Web程序设计中最吸引人而且最复杂的当然就是web数据库程序了。平心而论,其复杂高深的程度决不是你们可以想象得到的。我们先来看看其中涉及到的几个方面的问题:

        1.最基本的html设计

        2.CGI程序编写调试

        3.网络管理和客户协调

        4.数据库编写

        5.客户/服务体系程序编写

        另外你还得不时地同你的客户进行斗争,以取得他们对你工作的认同。因此编写一个大型WEB数据库,是综合素质的考验。

        笔者自问尚不完全具备以上的能力,但有幸曾参加过几个web数据库的开发,算是具备了初步的经验吧。这里给大家分享,也算是感谢各位对这个断断续续的教程的总结吧。

        一 数据库选择

        从一般情况来看,使用web数据库往往是要解决数据的归纳、索引和维护的问题。我们一般选择最流行的关系型数据库,比如NT下的sql,win95和nt下的Access,NT下的sybase,unix下的msql等等。当然还有Oracle、FileMaker PRO、Paradox等等。这些都是很流行的Sql数据库。Sql给数据管理提供了一个标准而坚实的接口,它对数据库操作饿所有函数必需在数据库语言中实现。这种函数包括:数据对象的创建、插入数据和数据修改等。对于数据量不大的小型数据库,一般使用access。

        二 接口程序CGI/PERL学习

        虽然我们可以直接编写WEB的CGI接口,但是那是工作量巨大且麻烦异常的工作。为了减轻开发者的负担,数据库程序员为我们编写了许多可以直接使用的接口程序,配合不同的数据库。下面就是一些十分常用的接口程序:

        1. DB2WWW

        http://www.software.ibm.com/data/db2/db2wfac2.html

        这是一个用于和IBM DB2数据库进行连接的工具。在HTTP服务器中,这种工具将HTML文件和SQL命令作为宏文件存储,然后,DB2WWW在接受到浏览器请求后就处理这些宏文件。

        2. dbCGI

        http://www.progress.com/webtools.html

        这个工具通过在html文件中内置SQL语句来实现和数据库的连接。适用于Progress,Sybase,Oracle,Informix,Ingres和ODBC。下面是一个典型的dbCGI程序代码:

    <title>dbCGI test</title>
    <sql init>
    INFORMIXDIR=/usr/informixdir
    SQLEXEC=/usr/informix/sqlturbo
    TBCONFIG=tbconfig
    </sql>
    <sql connect connl>
    <DATABASE=stores>
    <sql>
    <sql format>
    % [! 8:<h1>%8d</h1>%]
    ....
    </sql>
    <sql query connl>
    selet *
    from customer
    order by date,city,zipcode
    </sql>
    <sql disconect connl>
    </sql>
    <sql uninit>
    </sql>
        这个工具通过<sql>标签和%转意字符来把sql语句放置在html语句内。

        3 Genera

        http://gdbdoc.gdb.org/letovsky/genera/general.html

        这个是sybase数据库系统的网关。它通过在文本文件中加入特定的语句来和数据库进行连接。

        4 WebDBC

        http://www.ndev.com

        以windows NT为平台,可以访问所有对odbc兼容的数据库。

        5 A-Xorion

        http://www.clark.net/infouser/endidc.html

        他是一个CGI网关,它可以访问大多数的PC机数据库。它以Windows3.1/95/NT为平台。数据库为Ms Access2.0。

        三 编程语言CGI/PERL学习

        上面介绍的是一些常用的接口程序,它们需要Server的配合才能正常工作。当然如果是很小的数据库程序,不需要使用如此复杂的数据库接口程序。用C,Perl,VB等等,写成CGI程序,在CGI程序内调用数据库。虽然速度方面不是很快,但绝对是非常简单的。

        最后的例子:

        最后,我准备以一个例子来结束这个教程。

        环境:

        这是一个非常简单的WEB应用程序。如果你要运行这个程序,也许你得化些时间来配置自己的系统。在这个例子里,CGI程序由Perl5来编写,后台数据库使用sybase system 10,Sybperl用于建立脚本和数据库之间的通信,用其他的CGI后台数据库接口程序也可以。

    CGI程序:

    <head>
    <title>会议登记程序</title>
    </head>
    <body>
    <h2>会议登记系统</h2>
    please fill out the following form. A registration packet will be sent to you immediatel you.Note that all <b>bolad-faced</b>fields muse be complected.
    <hr>
    <form method="post" action="cgi-bin/resgister.pl">
    <b>first name:</b><input type="text" name="c_fname" size=30>
    <p>
    <b>Last name:</b><input type="text" name="c_lname" size=30>
    <p>
    <b>address 1:</b><input type="text" name="c_add1" size=30>
    <p>
    <b>address 2:</b><input type="text" name="c_add2" size=30>
    <p>
    <b>city:</b><input type="text" name="c_city" size=30>
    <p>
    <b>State:</b><input type="text" name="c_state" size=2>
    <p>
    <b>Zip:</b><input type="text" name="c_zip" size=15>
    <p>
    <b>phone:</b><input type="text" name="c_phone" size=15>
    <p>
    <b>Fax:</b><input type="text" name="c_fax" size=15>
    <p>
    <b>Email:</b><input type="text" name="c_email" size=15>
    <p>
    Packge:
    <ul>
    <li><input type="radio" name="c_packge" valuge="a">Package A
    <li><input type="radio" name="c_packge" valuge="b">Package B
    <li><input type="radio" name="c_packge" valuge="c">Package C
    </ul>
    How did you hear about the conference:
    <ul>
    <li><input type="radio" name="c_ad" value="a">Direct Mail
    <li><input type="radio" name="c_ad" value="b">Associate
    <li><input type="radio" name="c_ad" value="c">Journal
    <li><input type="radio" name="c_ad" value="d">Other
    </ul>
    <p>
    <input type="reset" value="clear"><input type="submit" value="Register"><p>
    </form>

    <hr>
    </body>

    Perl脚本:
    #!/usr/local/bin/perl
    require"cgi-lib.pl";
    &ReadParse(* input);
    $mc_fname=$input{'c_fname'};
    $mc_lname=$input{'c_lname'};
    $mc_add1=$input{'c_add1'};
    $mc_add2=$input{'c_add2'};
    $mc_city=$input{'c_city'};
    $mc_state=$input{'c_state'};
    $mc_zip=$input{'c_zip'};
    $mc_phone=$input{'c_phone'};
    $mc_fax=$input{'c_fax'};
    $mc_email=$input{'c_email'};
    $mc_package=$input{'c_package'};
    $mc_ad=$input{'c_ad'};

    print &PrintHeader;

    if (($mc_fname eq"")||(mc_lname eq "")||(mc_add1  eq "")||($mc_add2  eq "")||(
    mc_city eq "")||(mc_state eq "")||(mc_zip  eq "")){
    printf ("<br>");
    printf(",strong>Your registration cannot be processed as is.Pleae make sure all the requied fields are filled properly.</strong>");
    print"<p>";
    print"Pleae use the <i>Back</i>button to complete the form.n";
    }
    else{# data is OK

    use Sybase::DBlib;

    $dbh=Sybase::DBlib->dblogin('conf_user','123','DB-SERVER','REG');
    $dbh->dbuse('conference');

    $sqlcmd="insert into reg(c_fname,c_lanme,c_add1,c_add2,c_city,c_state,c_zip, c_phone,c_fax,c_email,c_package,c_ad)";

    $sqlcmd=$sqlcmd."values("
    $sqlcmd=$sqlcmd.'"".$mc_fname."",";
    $sqlcmd=$sqlcmd.'"".$mc_flame."",";
    $sqlcmd=$sqlcmd.'"".$mc_add1."",";
    $sqlcmd=$sqlcmd.'"".$mc_add2."",";
    $sqlcmd=$sqlcmd.'"".$mc_city."",";
    $sqlcmd=$sqlcmd.'"".$mc_state."",";
    $sqlcmd=$sqlcmd.'"".$mc_zip."",";
    $sqlcmd=$sqlcmd.'"".$mc_phone."",";
    $sqlcmd=$sqlcmd.'"".$mc_fax."",";
    $sqlcmd=$sqlcmd.'"".$mc_email."",";
    $sqlcmd=$sqlcmd.'"".$mc_package."",";
    $sqlcmd=$sqlcmd.'"".$mc_ad."",";
    $sqlcmd=$sqlcmd.'"".$mc_fax."",";
    $dbh->dbcmd($sqlcmd."n");
    $dbh->dbsqlexec;

    print"<strong>Thank you.</strong>Your registration has been submitted.You should receive you packet shourtly in the mail.";

    }

    展开全文
  • CGI

    2010-10-06 17:31:00
    CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。在物理上是一段程序,运行在服务器上,提供同客户端 ...

    CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。在物理上是一段程序,运行在服务器上,提供同客户端 Html页面的接口。这样说大概还不好理解。那么我们看一个实际例子: 现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户端输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的CGI目录下特定的cgi程序中,于是cgi程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后cgi程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样。整个过程结束。绝大多数的CGI程序被用来解释处理来自表单 的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。CGI程序使网页具有交互功能。

    处理步骤

    ⑴通过Internet把用户请求送到服务器。

    ⑵服务器接收用户请求并交给CGI程序处理。

    ⑶CGI程序把处理结果传送给服务器。

    ⑷服务器把结果送回到用户。

     

    环境变量列表

    SERVER-NAME:运行CGI序为机器名或IP地址。

    SERVER-INTERFACE:WWW服务器的类型,如:CERN型或NCSA型。

    SERVER-PROTOCOL:通信协议,应当是HTTP/1.0。

    SERVER-PORT:TCP端口,一般说来web端口是80。

    HTTP-ACCEPT:HTTP定义的浏览器能够接受的数据类型。

    HTTP-REFERER: 发送表单的文件URL。(并非所有的浏览器都传送这一变量)

    HTTP-USER-AGENT:发送表单的浏览器的有关信息。

    GETWAY-INTERFACE:CGI程序的版本,在UNIX下为 CGI/1.1。

    PATH-TRANSLATED: PATH-INFO中包含的实际路径名。

    PATH-INFO:浏览器用GET方式发送数据时的附加路径。

    SCRIPT-NAME: CGI程序的路径名。

    QUERY-STRING:表单输入的数据,URL中间号后的内容。

    REMOTE-HOST:发送程序的主机名,不能确定该值。

    REMOTE-ADDR:发送程序的机器的IP地址。

    REMOTE-USER:发送程序的人名。

    CONTENT-TYPE:POST发送,一般为applioation/xwww-form-urlencoded。

    CONTENT-LENGTH:POST方法输入的数据的字节数。

     

    CGI应用程序的工作原理是这样的:

      1.浏览器通过HTML表单或超链接请求指上一个CGI应用程序的URL。

      2.服务器收发到请求。

      3.服务器执行指定所CGI应用程序。

      4.CGI应用程序执行所需要的操作,通常是基于浏览者输人的内容。

      5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。

      6.网络服务器把结果返回到浏览器中。

      有关CGI应用程序要注意的是:

      CGI应用程序运行在浏览器可以请求的服务器系统上,执行时需要使用服务器CPU时间和内存。如果有成千上万的这种程序会同时运行,那会对服务器系统提出极高的要求。你要慎重考虑这个问题,以防止服务器系统崩溃。

      不完善的CGI应用程序可能成为别人非法进人服务器系统的通道,有可能导致重要的资料被删除或外泄。

      CGI应用程序主要的用途有以下几种:

      根据浏览者填写的HTML表单发送定制的答复。

      创建可单击的图像缩小图。

      创建一个浏览者可以搜索内容的数据库。

      提供服务器与数据库的接口,并把结果转换成HTML文档。

      制作动态HTML文挡。

      如果一个CGI脚本可以在每台计算机上做同样的事情;编写脚本就会变的很容易。不幸的是,CGI脚本依赖于服务器的操作系统,因此,对于非UNIX服务器来说,Prl(UNIX下编写脚本的一个常用工具)脚本毫无用处。所以,你必须定制安装你的CGI脚本。

      大多数服务器都提供CGI-BIN目录 ,但是这还不够。因为你应该拥有自己的CGI-BIN。这样,你就能运行自己的脚本(而不是让自己的系统去适应已存在于系统上的脚本)。因此,你的提供商应安装CGI-BIN,且能够帮助你编写脚本。

    展开全文
  • CGI程序设计指南.pdf

    热门讨论 2013-10-10 09:34:42
    目 录 第一部分 CGI编程基础 第一章 通用网关接口简介 第二章 CGI编程初步 第三章 CGI程序运行准备 第二部分 CGI编程实例 第四章 用户意见簿 第五章 网络考试 第三部分 CGI高级话题 第六章 Web数据库应用 第七章 ...
  • CGI介绍

    千次阅读 2019-08-21 17:17:36
    本文主要介绍CGI的相关知识。 1. 概念、背景及架构 CGI(Common Gateway Interface),即通用网关接口,是WWW技术中最重要的技术之一,是外部应用程序(即CGI程序)与WEB服务器之间的接口标准,负责在CGI程序和Web...
  • 我的form表单能在网页上显示,当我输入数值点提交的时候,就会出错,也就是不能连接到我的CGI处理程序上。把form表单里带url连接"http://127.0.0.1:8080/cgi-bin/multi.cgi",输入到网址栏能够打开,并且能够运行。...
  • cgi应该木有问题,我试过直接访问的。 js相关代码如下,求大神解答! ![图片说明](https://img-ask.csdn.net/upload/201606/16/1466071154_287192.png) ![图片说明]...
  • cgi交互

    2010-09-08 17:24:00
    今天终于知道cgi不响应的问题了!原来我设置了boa的根目录为/home/xxx/www,结果html中submit调用的是/var/www/cgi-bin下的cgi程序,郁闷好几天。现在不敢乱改了,老老实实按原来的配置写代码。
  • 我的cgi脚本是用shell写的 中间调用了expect的命令 因为我的程序其中一步需要输入密码 但是一直不能实现我的需求 脚本在中间会停住不动。。。(我不知道应该如何形容它) 屏幕显示是这样的 root@nicole-virtual-...
  • 之前在/var/www/cgi-bin中编写的html,py,cgi文件通过web能访问,现在编写的就不能访问。 一直报错: Internal Server Error The server encountered an internal error or misconfiguration and was unable to ...
  • 提供的一个cgi接口,用于实现发送一个字符串(包含了几个字段的数据)给他们的cgi 脚本,我们发送不论成功或者失败,他们都会返回一个具体的int值给我们,我该如何发 送并获取返回值?网上看到的资料不是特别多,...
  • 请教:用 lsof|grep php-cgi |grep DEL -c 查出有17286条,有童鞋知道原因的么? php-cgi 18923 vagrant DEL REG 0,4 40290375 /dev/zero php-cgi 18923 vagrant DEL REG 0,4 40290374 /dev/zero php-cgi 18923 ...
  • CGI简介——用C来写CGI程序简要指南

    千次阅读 2016-09-05 00:55:37
    1. 什么是CGI ?CGI 是通用网关接口(Common Gateway Interface)的缩写. 它主要用于服务器端动态输出客户端的请求(如,HTML页面/二进制文件). 也就是说客户端请求参数不同, 服务器端会给出不同的应答结果..CGI 标准将这...
  • php交叉编译 make无法产生php-cgi 文件, 配置 ./configure --target=bfin-linux-uclibc --with-libxml-dir=/opt/uClinux/bfin-uclinux/ --with-zlib-dir=/opt/uClinux/bfin-uclinux/ --prefix=/opt/uClinux/...
  • CGI机制和CGI程序

    2018-07-17 23:23:33
    1. CGI机制 CGI(common gateway interface)——通用网关接口,是一个web服务器提供信息服务的接口。 通过CGI接口,web服务器就能获得客户端提交的信息,转交给服务器端的CGI程序,最终将结果返回给浏览器。 ...
  • CGI机制与CGI程序

    2018-08-15 11:50:31
    CGI机制 CGI(common gateway interface)——通用网关接口,是一个web服务器提供信息服务的接口。 通过CGI接口,web服务器就能获得客户端提交的信息,转交给服务器端的CGI程序,最终将结果返回给浏览器。 组成...
  • CGI 与 fast_cgi

    2017-02-18 17:06:20
    1.CGI 概述 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html。事物总是不 断发展,网站也越来越复杂,所以出现动态技术。但是服务器并不能直接运行 ...

空空如也

1 2 3 4 5 ... 20
收藏数 51,161
精华内容 20,464
关键字:

cgi