服务器CGI运行机制
CGI概括:
定义
通用网关接口(Common Gateway Interface)是HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。
功能
绝大多数的CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。CGI程序使网页具有交互功能。
运行环境
CGI程序在UNIX操作系统上CERN或NCSA格式的服务器上运行。
在其它操作系统(如:windows NT及windows95等)的服务器上也广泛地使用CGI程序,同时它也适用于各种类型机器。
处理步骤
⑴通过Internet把用户请求发送到服务器。
⑵服务器接收用户请求并交给CGI程序处理。
⑶CGI程序把处理结果传送给服务器。
⑷服务器把结果送回到用户。
一、基本原理
CGI :通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,WEB服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
组成CGI通信系统主要是两部分:一部分是html页面,另一部分是运行在服务器上的CGI程序。
它们之间的通讯方式如下图:
服务器与客户端之间的通信,是客户端的浏览器和服务器端的http服务器之间的HTTP通信,在这里只需要知道浏览器请求执行服务器上哪个CGI程序就行了;
服务器和CGI程序之间的通讯才是我们关注的。一般情况下,服务器和CGI程序之间是通过标准输入输出来进行数据传递的,而这个过程需要环境变量的协作方可实现。
1、服务器将URL指向一个应用程序
2、服务器为应用程序执行做准备
3、应用程序执行,读取标准输入和有关环境变量
4、应用程序进行标准输出
环境变量在CGI中有着重要的地位,每个CGI程序只能处理一个用户请求,所以在激活一个CGI程序进程时创建了属于该进程的环境变量。
二、环境变量
对于CGI程序来说,它继承了系统的环境变量,CGI变量在CGI程序启动时初始化,在结束时销毁。
当一个CGI程序不是被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制。当这个CGI程序被HTTP服务器调用时,它的环境变量就会多了以下关于HTTP服务器、客户端。CGI传输过程等项目。
与请求相关的环境变量:
REQUEST_METHOD(服务器与CGI程序之间的信息传输方式)
QUERY_STRING(采用GET时所传输的信息)
CONTNENT_LENGTH(STDIO中的有效信息长度)
CONTENT_TYPE(指示所传来的信息的MIME类型)
CONTENT_FILE(使用windows httpd/wincgi标准时,用来传送数据的文件名)
....等等
与服务器有关环境变量:
GATEWAY_INTERFACE(服务器所实现的CGI版本)
SERVER_NAME(服务器的IP或名字)
SERVER_PORT(主机的端口号)
SERVER_SOFTWARE(调用CGI程序的HTTP服务器的名称和版本号)
与客户端相关的环境变量:
REMOTE_ADDR(客户机的主机名)
REMOTE_HOST(客户机的IP地址)
ACCEPT(列出客户机支持的编码方式)
ACCEPT_LANGUAGE(表明客户机可接受语言的ISO代码)
AUTORIZATION(表明被证实了的用户)
FROM(列出客户机的email地址)
IF_MODIFIED_SINGCE(当用get方式请求并且只有当文档比指定日期更早时才返回数据)
PRAGMA(设定将来要用到的服务器代理)
REFFERER(指定连接到当前文档的文档的URL)
USER AGENT(客户端浏览器的信息)
/**
*其实上面的变量在都可以在http报文的消息头里面找到
**/
CONTENT_TYPE:如application/x-www-form-urlencoded,表示数据来自HTML表单,并且经过URL编码。
ACCEPT:客户机所支持的MIME类型清单,内容如:’image/gif,image/jpeg’
REQUEST_METHOD:一般包含POST和GET.
环境变量是一个保存用户信息的内存区。当客户端的用户通过浏览器发出CGI请求时,服务器就寻找本地的相应CGI程序并执行它。在执行CGI程序的同时,服务器把该用户的信息保存到环境变量里。接下来,CGI程序的执行流程是这样的:查询与该CGI程序进程相应的环境变量:第一步是request_method,如果是POST,就从环境变量的len,然后到该进程相应的标准输入取出len长的数据。如果是GET,则用户数据就在环境变量的QUERY_STRING里.
三.CGI程序实现步骤:
1.从服务器上获取数据:
获取环境变量的时候,“如果先判断REQUEST_METHOD”是否存在,程序会更健壮,否则在某些情况下可能会造成程序崩溃。因为假若CGI程序不是由服务器调用的,那么环境变量集里就没有与CGI相关的环境变量(如REQUEST_METHOD,REMOTE_ADDR等)添加“进来,也就是说geten(“REQUEST_METHOD”)”将返回NULL!
2.URL编码:
不管是POST还是GET方式,客户端浏览器发送给服务器的数据都不是原始的用户数据,而是经过URL编码的。此时,CGI的环境变量Content_type将被设置,如Content_type = application/x-www-form-urlencode就表示服务器收到的是经过URL编码的包含有HTML表单变量数据。
编码的基本规则是:变量之间用“&”分开;
“变量与其对应值用=”连接;“空格用+”代替;
“保留的控制字符则用%”连接对应的16禁止ASCII码代替;
“某些具有特殊意义的字符也用%”接对应的16进制ASCII码代替;空格是非法字符;
任意不可打印的ASCII控制字符均为非法字符。
3.CGI数据输出:
CGI程序如何将信息处理结果返回给客户端?这实际上是CGI格式化输出。 在CGI程序中的标准输出stdout是经过重定义了的,它并没有在服务器上产生任何的输出内容,而是被重定向到客户浏览器,这与它是由C,还是Perl或Python实现无关。 所以,我们可以用打印来实现客户端新的HTML页面的生成。比如,C的printf是向该进程的标准输出发送数据,Perl和Python用print向该进程的标准输出发送数据。
(1)CGI标题
CGI的格式输出内容必须组织成标题/内容的形式。CGI标准规定了CGI程序可以使用的三个HTTP标题。标题必须占据第一行输出!而且必须随后带有一个空行。
标题描述:
Content_type (内容类型)设定随后输出数据所用的MIME类型
Location (地址)设定输出为另外一个文档(URL)Status (状态)指定HTTP状态码MIME:
向标准输出发送网页内容时要遵守MIME格式规则:
任意输出前面必须有一个用于定义MIME类型的输出内容(Content-type)行,而且随后还必须跟一个空行。如果遗漏了这一条,服务将会返回一个错误信息。(同样使用于其他标题)
例如Perl和Python:
print “Content-type:text/html\n\n”; //输出HTML格式的数据
print “<body>welcome<br>”
print “</body>”
C语言:
printf( “Content-type:text/html\n\n”);
printf(“Welcome\n”);
MIME类型以类型/子类型(type/subtype)的形式表示。
其中type表示一下几种典型文件格式的一种:
Text、Audio、Video、Image、Application、Mutipart、Message
Subtype则用来描述具体所用的数据格式。
Application/msword微软的Word文件
Application/octet-stream一种通用的二进制文件格式
Application/zipZip压缩文件
Application/pdfPdf文件
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Location:
使用Location标题,一个CGI可以使当前用户转而访问同一服务器上的另外一个程序,甚至可以访问另外一个URL,但服务器对他们的处理方式不一样。
使用Location的格式为:Location:Filename/URL,
例如:print “Location:/test.html\n\n”;
这与直接链接到test.html的效果是一样的。
print “Location:http://www.chinaunix.com/\n\n”
由于该URL并不指向当前服务器,用户浏览器并不会直接链接到指定的URL,而是给用户输出提示信息。
HTTP状态码:
表示了请求的结果状态,是CGI程序通过服务器用来通知用户其请求是否成功执行的信息码,本文不做研究。
四、CGI中的信号量和文件锁
因为CGI程序时公用的,而WEB服务器都支持多进程运行,因此可能会发生同时有多个用户访问同一个CGI程序的情况。比如,有2个用户几乎同时访问同一个CGI程序,服务器为他们创建了2个CGI程序进程,设为进程A和进程B。假如进程A首先打开了某个文件,然后由于某种原因被挂起(一般是由于操作系统的进程调度);而就在进程A被挂起的这段时间内,进程B完成了对文件的整个操作流程:打开,写入,关闭;进程A再继续往下执行,但进程A所操作的文件依旧是原来文件的就版本,此时进程A的操作结果将覆盖进程B的操作结果。
为了防止这种情况发生,需要用到文件锁或者信号量。
钥匙文件?假如有多个不同的HTML可以调用同一个CGI程序,那么CGI程序如何区分它们呢?一个是通过隐含的INPUT标签。不过觉得这个比较麻烦,因为CGI必须经过一系列解码后才能找到这个隐含INPUT的变量和其值。
五.设置HTTP服务器以兼容CGI
用Perl编写的CGI程序后缀为:.pl;Python编写的CGI程序后缀为:.py;而C编写的CGI程序后缀为:.cgi,如果在win下编译出来的是.exe,最好将它重命名为.cgi。这些都是为了HTTP服务能够识别并调用它们。
当使用appche httpd服务器时,请编辑它的配置文件httpd.conf如下:修改AddHandler cgi-script一句为AddHandler cgi-script .cgi .py .pl
本文转自http://blog.csdn.net/qq_31159377/article/details/49481545
服务器CGI运行机制的更多相关文章
- IIS 内部运行机制及Asp.Net执行过程详解
一直以来对一个Asp.net页面穿过IIS后就返回给浏览器一个HTML页面感觉很是神奇.虽然做技术这么长时间了,也曾经大致了解过一点来龙去脉,但是如果你真的问起我比较详细的过程,我还真的回答不上来,好 ...
- 深入理解JavaScript运行机制
深入理解JavaScript运行机制 前言 本文是写作在给团队新人培训之际,所以其实本文的受众是对JavaScript的运行机制不了解或了解起来有困难的小伙伴.也就是说,其实真正的原理和本文阐述的并不 ...
- ASP.NET MVC的运行机制--url的全局分析
全局 首先我们来看一副图片 首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerNam ...
- JavaWeb三大组件——过滤器的运行机制理解
过滤器Filter 文章前言:本文侧重实用和理解. 一.过滤器的概念. lFilter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 ...
- SSL/TLS协议运行机制的概述
互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...
- SSL/TLS协议运行机制
转载自http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行 ...
- JSP基础总结(运行机制、脚本元素、指令元素、动作元素)
JSP的运行机制: 1.转译阶段:JSP页面转换成Servlet类: 2.请求阶段:Servlet类执行,将相应结果发送至客户端. 流程解释: 1.用户访问某个JSP页面 2.服务器找到相应的JSP页 ...
- 【转】SSL/TLS协议运行机制的概述
互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...
- PHP的运行机制与原理(底层) [转]
说到php的运行机制还要先给大家介绍php的模块,PHP总共有三个模块:内核.Zend引擎.以及扩展层:PHP内核用来处理请求.文件流.错误处理等相关操作:Zend引擎(ZE)用以将源文件转换成机器语 ...
随机推荐
- 通过代码自定义cell(cell的高度不一致)
- C#大文件读取和查询--内存映射
笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该 ...
- Webform Application、ViewState
Application(全局对象) Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动 ...
- java代码打包成jar以及转换为exe
教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有 ...
- 《zw版·Halcon-delphi系列原创教程》 zw版-Halcon常用函数Top100中文速查手册
<zw版·Halcon-delphi系列原创教程> zw版-Halcon常用函数Top100中文速查手册 Halcon函数库非常庞大,v11版有1900多个算子(函数). 这个Top版,对 ...
- SVN提交时响应很慢,我是这样解决的。
现象:使用TortoiseSVN提交文件时,弹出提交窗口,要等待30秒的样子,才开始工作,开始提交文件后速度还是很快的. 解决后提交文件几乎是秒杀. 解决办法 (我的电脑可以了,但还是有些同事的电脑没 ...
- C# 自动Ping 测试服务器运行状况
通过小程序自动Ping配置文件中的IP地址,间隔时间.IP地址.手机号码通过配置文件获得. 废话不多说,上代码. using Newtonsoft.Json; using Newtonsoft.Jso ...
- Card Flip
卡牌效果:O(∩_∩)O,只做了webkit浏览器的效果,请用chrome~ 1.首先呢,先用一个框框把卡牌包住,然后呢,搞两个子元素作为卡牌正反面.当然咯,反面是看不见滴~ <section ...
- 接口测试之HTTP协议详解
引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...
- treeview所有节点递归解法(转+说明)或者说递归的实际应用
public void PrintTreeViewNode(TreeNodeCollection node) { foreach (TreeNode n in node) { Response.Wri ...