cgi通用网关接口
分类:关于计算机

CGI(通用网关接口卡塔 尔(英语:State of Qatar),cgi通用网关接口

公物网关接口

CGI(Common Gateway Interface) 是WWW才能中最保养的手艺之大器晚成,有着不行代替的第一人置。CGI是表面应用程序(CGI程序卡塔尔与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递消息的归程。CGI标准允许Web服务器实行外界程序,并将它们的输出发送给Web浏览器,CGI将Web的风流倜傥组差十分的少的静态超媒体文书档案造成三个整机的新的交互作用式媒体。

Common Gateway Interface,简单的称呼CGI。在概略上是后生可畏段程序,运转在服务器上,提供同顾客端HTML页面包车型客车接口。那样说差相当的少还倒霉通晓。那么大家看二个实在例子:以后的个人主页上绝大好多皆有三个留言本。留言本的工作是如此的:先由客户在客户端输入一些音讯,如名字之类的事物。接着客户按一下“留言”(到前段时间截止工作都在客商端卡塔 尔(英语:State of Qatar),浏览器把这么些新闻传递到服务器的CGI目录下一定的cgi程序中,于是cgi程序在服务器上据守预定的诀要举办拍卖。在本例中就是把客商提交的音信存入钦定的文书中。然后cgi程序给顾客端发送三个音讯,表示必要的任务现已甘休。那时候客商在浏览器里将见到“留言甘休”的字样。整个经过甘休。

功能

超级多的CGI程序被用来分解处理来自表单的输入音信,并在服务器产生相应的拍卖,或将相应的新闻反映给浏览器。CGI程序使网页具备人机联作功能。

管理步骤

⑴通过Internet把顾客央求送到web服务器。

⑵web服务器收到客户乞请并提交CGI程序管理。

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

⑷web服务器把结果送回来客户。

服务器配置

CGI程序不是放在服务器上就能够如愿运作,要是要想使其在服务器上顺利的运转并标准的管理客商的诉求,则须对所利用的服务器举办要求的设置。

铺排:依照所利用的服务器类型以至它的装置把CGI程序放在某大器晚成特定的目录中或使其蕴藉一定的恢宏名。

⑴CREN格式服务器的布置:

编写制定CREN格式服务器的配置文件(经常为/etc/httpd.conf卡塔 尔(阿拉伯语:قطر‎在文书中投入:Exec cgi-bin/*/home/www/cgi-bin/*.exec。命令中现身的首先个参数cgi-bin/*建议了在U凯雷德L中现身的目录名字,并代表它出以后系统主机后的第二个目录中,如:

CGI目录除了能够跟网络文件放在相像目录中,也能够献身系统的别的目录中,但一定要确保在您的体系中也颇有同等的目录。在对服务器达成安装后,须重新开动服务器(除非HTTP服务器是用inetd运行的卡塔 尔(阿拉伯语:قطر‎。

⑵NCSA格式服务器的布局

在NCSA格式服务器上有二种方式开展安装:

①在srm.conf文件(平时在conf目录下卡塔尔国中加入:Script Alias/cgi-bin/cgi-bin/。Script Alias命令提议某一索引下的文本是可执路程序,且那么些命令是用来执行那么些程序的;此命令的三个参数与CELANDN格式服务器中的Exec命令的参数的意味同样。

②在srm.conf文件参与:Add type application/x-httpd-cgi.cgi。此命令表示在服务器上加码了黄金年代种新的文件类型,其后首先个参数为CGI程序的MIME类型,第一个参数是文本的恢弘名,表示以那黄金时代扩张名字为扩大名的文本是CGI程序。

在用上述措施之大器晚成设置服务器后,都得重复开动服务器(除非HTTP服务器是用inetd运营的卡塔尔国。

编辑语言

CGI能够用此外生龙活虎种语言编写,只要这种语言具有专门的学问输入、输出和情况变量。对初读书人的话,最佳接收易于归档和能管用代表大批量数据结构的言语,举例UNIX情况中:

· Perl (Practical Extraction and Report Language)

· Bourne Shell或者Tcl (Tool Command Language)

· PHP(Hypertext Preprocessor))

鉴于C语言有较强的平台毫不相关性,所以也是编辑CGI程序的首荐。

Windows环境中:

· C和C++

鉴于Internet上海大学部分服务器使用的是UNIX操作系统,且差非常少任后生可畏UNIX操作系统中都有Bourne Shell,因以前边呈报的例证中许多是用Bourne Shell编写的。

最终Perl由于其跨操作系统、易于校订的天性成为了CGI的主流编写语言,以至于平常的“cgi程序”正是Perl程序。

情况变量列表

SERVER_NAME:运维CGI序为机械名或IP地址。

SERVER_INTECR-VFACE:WWW服务器的品类,如:CETiggoN型或NCSA型。

SERVER_PROTOCOL:通讯协议,应当是HTTP/1.0。

SERVER_PORT:TCP端口,日常说来web端口是80。

HTTP_ACCEPT:HTTP定义的浏览器能够承当的数据类型。

HTTP_REFERE索罗德:发送表单的文书U奥德赛L。(并不是全数的浏览器都传送那后生可畏变量卡塔尔国

HTTP_USE奥德赛-AGENT:发送表单的浏览器的有关音信。

GETWAY_INTERAV4FACE:CGI程序的版本,在UNIX下为 CGI/1.1。

PATH_TRANSLATED:PATH_INFO中包含的莫过于路线名。

PATH_INFO:浏览器用GET方式发送数据时的增大路线。

SCRIPT_NAME:CGI程序的路线名。

QUERY_STWranglerING:表单输入的多寡,U库罗德L中问号后的原委。

REMOTE_HOST:发送程序的主机名,不可能分明该值。

REMOTE_ADD奥迪Q7:发送程序的机械的IP地址。

REMOTE_USECRUISER:发送程序的姓名。

CONTENT_TYPE:POST发送,一般为application/xwww-form-urlencoded。

CONTENT_LENGTH:POST方法输入的数码的字节数。

 

搭建C语言CGI和Apache服务器的开荒条件

 

手续如下:

率先,要求利用的这个工具和代码:

  • C语言编写翻译器;
  • Apache服务器,笔者用的是USBWebSever中包罗的Apache服务器(下载地址卡塔尔,那是个AMP服务器套装,不用安装就可以使用,而地点安装的Apche服务器也得以接纳;

接着,编译C语言的cgi程序。

 源码如下:C CGI Example

接下来,配置和运转Apache服务器。

对USBWebSever,对settings目录下的httpd.conf如下内容张开退换,如下:

ScriptAlias /cgi-bin/ "{rootdir}/cgi-bin/"

<Directory "{rootdir}/cgi-bin">
#   AllowOverride All
#   Options None
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
AddHandler cgi-script .exe .pl .cgi

改适逢其会未来,双击USBWebSever.exe就能够运营Apache服务器了。

末段把刚刚变动的cgi程序(.exe文件卡塔尔国,复制放到上文中提到的/cgi-bin/目录下,文件名最棒改成index.cgi那样的情势。对于USBWebSever,cgi-bin目录应当是root目录下的cgi-bin目录(若无要新建三个卡塔尔国,不是和USBWebSever在雷同目录下的cgi-bin目录。目录结构如下:

图片 1

张开浏览器输入 

 

C CGI Example

index.html

<head>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <body>
    <form action="/cgi-bin/mult.cgi">
        <p>CGI表单处理:Get方法演示:输入乘数和被乘数,计算结果</p>
            M : <input name="m" size="5">
            N : <input name="n" size="5">
        <br><input type="submit" value="确定"></input></br>

    </form>

    <form action="/cgi-bin/collect.cgi" method="POST" >
        <p>CGI表单处理:Post方法演示:请输入您的留言(最多80个字符):
        <br><input name="data" size="60" maxlength="80"></br>
        <input type="SUBMIT" value="确定">
    </form> 

    <form action="/cgi-bin/viewdata.cgi">
        <p><input type="SUBMIT" value="察看留言">
    </form>
  </body>
</head>

mult.cgi

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char *data;
    long m, n;
    printf("%s", "Content-Type:text/htmlnn");
    printf("<html>");
    printf("<head><title>乘法结果</title>");
    printf("<h3>乘法结果</h3> ");
    printf("</head><body>");
    data = getenv("QUERY_STRING");
    if (data == NULL)
        printf("<p>错误!数据没有被输入或者数据传输有问题");
    else if (sscanf(data, "m=%ld&n=%ld", &m, &n) != 2)
        printf("<p>错误!输入数据非法。表单中输入的必须是数字。");
    else
        printf("<p>%ld * %ld = %ld。", m, n, m * n);
    printf("</body></html>");
    return 0;
}

运转示例:

 

collect.cgi

#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 80
#define EXTRA 5
 4个字节留给字段的名字"data", 1个字节留给"="
#define MAXINPUT MAXLEN+EXTRA+2
 1个字节留给换行符,还有一个留给后面的NULL
#define DATAFILE "../data/data.txt"
 要被添加数据的文件
void decode(char *src, char *last, char *dest)
{
    for (; src != last; src++, dest++)
        if (*src == '+')
            *dest = ' ';
        else if (*src == '%')
        {
            int code;
            if (sscanf(src + 1, "%2x", &code) != 1)
                code = '?';
            *dest = code;
            src += 2;
        }
        else
            *dest = *src;
    *dest = 'n';
    *++dest = '';
}
int main(void)
{
    char *lenstr;
    char input[MAXINPUT], data[MAXINPUT];
    long len;
    printf("%s", "Content-Type:text/htmlnn");
    printf("<html><head><title>Response</title>");
    printf("</head><body>");
    lenstr = getenv("CONTENT_LENGTH");
    if (lenstr == NULL || sscanf(lenstr, "%ld", &len) != 1 || len> MAXLEN)
        printf("<p>表单提交错误");
    else
    {
        FILE *f;
        fgets(input, len + 1, stdin);
        decode(input + EXTRA, input + len, data);
        f = fopen(DATAFILE, "a");
        if (f == NULL)
            printf("<p>对不起,意外错误导致系统无法保存你的留言");
        else{
            fputs(data, f);
            printf("<p>非常感谢,您的留言已被系统接收");
        }

        fclose(f);

    }

    printf("</body></html>");
    return 0;
}

运作示例:

 

viewdata.cgi

#include <stdio.h>
#include <stdlib.h>
#define DATAFILE "../data/data.txt"
int main(void)
{
    FILE *f = fopen(DATAFILE, "r");
    int ch;
    if (f == NULL)
    {
        printf("%s", "Content-Type:text/htmlnn");
        printf("<P><EM>意外错误,无法打开文件</EM>");
    }
    else
    {
        printf("%s", "Content-Type:text/plainnn");
        while ((ch = getc(f)) != EOF)
            putchar(ch);
        fclose(f);
    }

    return 0;
}

运维示例:

公共网关接口 CGI(Common Gateway Interface) 是WWW手艺中最首要的技巧之生机勃勃,有着不行代替的重要地点。C...

本文由正版必中一肖图发布于关于计算机,转载请注明出处:cgi通用网关接口

上一篇:手册中关于怎样使用TQuery的误导,Delphi数据库编 下一篇:没有了
猜你喜欢
热门排行
精彩图文