CGI是什么

CGI全称是CommonGateway Interface,简称CGI,中文名叫做通用网关接口。

CGI程序就是符合CGI接口规范的程序,相对于WebServer来说也叫外部程序。

CGI接口规范的定义,使得WebSever具备了动态服务功能。客户端或者浏览器通过HTTP协议的GET、POST方法将将form表单数据提交给Web Sever,然后Web Sever 再将客户端的数据交给CGI程序处理,最后由CGI程序将用户数据的处理结果返回给Web Sever,Web Sever将处理结果返回给客户端。

Web Server收到客户端的数据,怎么传递给CGI程序? CGI程序处理后的结果怎么传回给Web Server?这些内容都在CGI规范里定义了。具体参考http://www.ietf.org/rfc/rfc3875.txt

CGI程序

CGI程序就是按照CGI规范,从WebServer获取客户端数据,然后进行相应处理,将处理结果返回给Web Server。因此CGI程序可以用任何编程语言实现,python,shell,C,java等等。

在linux下,CGI程序通过环境变量QUERY_STRING获取客户端数据,具有如下形式:”name1=value1&name2=value2&name3=value3”;CGI程序通过标准输出(stdout)将处理结果返回给WebServer。

Hello CGI

实现一个最简单的CGI程序,不处理任何客户端数据,只简单返回类似Hello World的页面。在实现CGI程序之前,需要有一个支持CGI的Web Sever运行起来,这里使用BOA Web Sever。具体编译安装方法请参考文章《boa-0.94.13 Web服务器的编译与运行》。

BOA 的CGI配置

只需修改一项,具体如下:ScriptAlias/cgi-bin/ /home/hyx/BOA/cgi-bin/

所有的cgi程序需要放入/home/hyx/BOA/cgi-bin/目录。

假设BOA服务器为http://192.168.181.100:8080

Shell实现

#!/bin/sh

echo "Content-type:text/html"

echo ""

echo "<html>"

echo"<head><title>cgiShellHello</title></head>"

echo "<body>"

echo '<h1>Hello World! <fontcolor="red">"CGI Shell"</font>  </h1>'

echo "</body>"

echo "</html>"

安装:cp  cgiShellHello/home/hyx/BOA/cgi-bin/

测试:浏览器访问http://192.168.181.100:8080/cgi-bin/cgiShellHello

<html>

<head><title>cgiCHello.c</title></head>

<body>

<h1>Hello World! <fontcolor="red">"CGI C"</font> </h1>

</body>

</html>

C实现

#include<stdio.h>

int main(int argc, char** argv)

{

printf("Content-type:text/html\n\n");

printf("<html>\n");

printf("<head><title>cgiCHello.c</title></head>\n");

printf("<body>\n");

printf("<h1>Hello World! <font color=\"blue\">\"CGI C\"</font>  </h1>\n");

printf("</body>\n");

printf("</html>\n");

return 0;

}

编译:gcc  –o cgiCHello cgiCHello.c

安装:cp  cgiCHello/home/hyx/BOA/cgi-bin/

测试:浏览器访问http://192.168.181.100:8080/cgi-bin/cgiCHello

<html>

<head><title>cgiCHello.c</title></head>

<body>

<h1>Hello World! <fontcolor="blue">"CGI C"</font> </h1>

</body>

</html>

关键点

上面C和 Shell编程实现的CGI程序,一方面说明了CGI程序可以有任意语言编程实现,另一方面也说明了两点:

一、Web Server与CGI程序通过标准输出交互信息,C语言的printf和Shell的echo都是标准输出接口。

二、上述CGI程序返回的的HTML文件,但是在真正的HTML文件之前都有一句Content-type:text/html。Content-type表明了后续的数据是什么类型,最终到达客户端浏览器时,浏览器根据此项指示决定如何处理后面的数据,如果是HTML就显示HTML页面。具体Content-type还有哪些内容,google&baidu吧。

boa-0.94.13:Hello CGI的更多相关文章

  1. Django 2.0 学习(13):Django模板继承和静态文件

    Django模板继承和静态文件 模板继承(extend) Django模板引擎中最强大也是最复杂的部分就是模板继承了,模板继承可以让我们创建一个基本的"骨架"模板,它可以包含网页中 ...

  2. 第三章:Hadoop简介及配置Hadoop-1.2.1,hbase-0.94.13集群

    前面给大家讲了怎么安装Hadoop,肯定会有人还是很迷茫,装完以后原来就是这个样子,但是怎么用,下面,先给大家讲下Hadoop简介:大致理解下就OK了 hadoop是一个平台,提供了庞大的存储和并行计 ...

  3. 精通Web Analytics 2.0 (13) 第十一章:变身分析忍者的指导原则

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第十一章:变身分析忍者的指导原则 这个激动人心的一章,分析了几乎所有工作的各个方面. 目标很简单:使用成熟的方法来帮助避免淹死的 ...

  4. ceph hammer 0.94.10手动部署方法Ceph Hammer版(0.94.10)手动部署for CentOS 7.x

    Ceph Hammer版(0.94.10)手动部署for CentOS 7.x --lin.wang 20190310 环境有三个节点node-1,node-2,node-3,每个节点三个ssd盘作为 ...

  5. 让人眼花缭乱的 RSS 版本0.90、0.91、0.92、0.93、0.94、1.0 和 2.0

    1.0的规范 http://web.resource.org/rss/1.0/spec 2.0的规范 http://cyber.law.harvard.edu/rss/rss.html 一个介绍什么是 ...

  6. Hbase 0.96 比 hbase 0.94的改变

    转载:http://blog.csdn.net/hxpjava1/article/details/20043703 环境: hadoop:hadoop-2.2.0 hbase:hbase-0.96.0 ...

  7. Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法

    Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法 这篇笔记将介绍如何使用Ext.Net GridPanel 中使用Sorter. 默认情况下,Ext.Net GridP ...

  8. ASP.NET Web API 2.0新特性:Attribute Routing1

    ASP.NET Web API 2.0新特性:Attribute Routing[上篇] 对于一个针对ASP.NET Web API的调用请求来说,请求的URL和对应的HTTP方法的组合最终决定了目标 ...

  9. 伪分布式hbase从0.94.11版本升级stable的1.4.9版本

    Hbase从0.94.11升级到stable的1.4.9版本: 升级思路: hadoop1.1.2    hbase 0.94.11                             ↓ had ...

随机推荐

  1. javascript 学习随笔1

    html部分 <body onload="message()"><!--主题部分加载就调用-->document.getElementById(" ...

  2. Web Application的目录结构

    Java web工程下的webapp或WebContent就是工程的发布文件夹,发布时会把该文件夹发布到tomcat的webapps里. 一个web应用必须要有的目录文件如下: webapp/WebC ...

  3. win8安装驱动提示文件哈希值不在指定的目录文件中,此文件可能已损坏或被篡改解决办法

    解决办法: 1. 按快捷键win+R 打开运行命令 2. (请先看完后面的再操作!!)运行输入 shutdown.exe /r /o /f /t 00 3. 点击确定 4. 系统将重启 5. 重启后点 ...

  4. Ubuntu下编译Android JNI最靠谱的方法...

    网上资料太杂乱,搞了大半天都还是没搞懂怎么系统的调用NDK.最后干脆放弃了Win改用Ubuntu编译JNI,虽然编译环境简单了,但是资料却少了不少.几乎没有一篇完整的文章.我想或许是能在Ubuntu下 ...

  5. line-height具体解释

    章:浏览器与Hack].7.3.5 应用:单行文字在垂直方向居中在网页设计中,往往为了突出标题而加入背景图案.如图7-31所看到的. watermark/2/text/aHR0cDovL2Jsb2cu ...

  6. CF(437C)The Child and Toy(馋)

    意甲冠军:给定一个无向图,每个小点右键.操作被拉动所有点逐一将去,直到一个点的其余部分,在连边和点拉远了点,在该点右点的其余的费用.寻找所需要的最低成本的运营完全成本. 解法:贪心的思想,每次将剩余点 ...

  7. HDOJ 4007 Dave【最大覆盖集】

    Dave Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Submis ...

  8. 你知道hover、active这四个伪类为什么要按顺序写吗

    刨根问底,你知道:hover等4个伪类为什么要按顺序排列吗 引言 :link,:visited,:hover,:active这4个伪类大家都不陌生,4个伪类要按照LvHa这个爱恨原则来排(外国友人起的 ...

  9. iOS开发之XMPP即时通讯简单实现

    首先搭载服务器和数据库 搭载服务器我用的是openfire,数据库用的是mysql 这里推荐两个链接 配置mysql,用的是mysql workbench http://justsee.iteye.c ...

  10. QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)

    QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信号调用存在于其他线程的slot函数,也可以 ...