web服务器与cgi程序最佳组合

web服务器与cgi程序最佳组合

web服务器通过接受用户请求交将用户请求的内容返回给用户,主要功能是提供网上信息浏览服务,支持http、https协议,常见的web服务器有apache、nginx、iis等服务器,Web服务器的代理模型(delegationmodel)非常简单。当一个请求(request)被送到Web服务器里来时,它只单纯的把请求(request)传递给可以很好的处理请求(request)的程序(服务器端脚本),这里的服务脚本即是cgi程序。

cgi程序是b/s模式中,即浏览器/服务器,是由用户在浏览器输入域名或ip,请求web服务器,然后web服务器通过自身提供的cgi接口来调用cgi脚本(php、python、c、c++等),然后cgi脚本将程序执行结果再传给web服务器,最后再把这些内容返回级用户,这时用户就看到了自已请求的内容。

客户端传输数据的并获取数据的原理:当服务端守护进程接收到客户端用户代理(如浏览器)提交的CGI请求时,所创建的CGI子进程会设置与CGI请求内容有关的环境变量,并建立服务器与外部CGI程序之间通讯的通道(即标准I/O)。CGI程序可以通过环境变量,标准I/O或命令行参数获取客户端用户输入的数据。数据的获取与请求所采用的HTTP方法(Method)和用户所使用的请求方式有关。

一、web服务器与cgi交互内容

1、获取环境变量
环境变量的类别很多,包含客户端和服务端的详细信息。在一般CGI程序开发中,下述几个环境变量在数据传递中起着重要作用。
*GATEWAY-INTERFACE
CGI程序所使用的CGI标准接口的版本号。如使用的CGI1.1版,该变量表示为”CGI/1.1″
*REQUEST-METHOD
HTTP请求方法。根据该变量值可判断CGI请求所采用的请求方法,以决定是通过Stdin还是通过环境变量QUERY-STRING获取客户端传输数据。
*QUERY-STRING
QUERY-STRING是CGI程序URL中”?”之后的数据。当使用ISINDEX查询或FORM表使用GET方法时,客户端传输数据可以通过读取该变量而获得。
*CONTENT-LENGTH
CONTENT-LENGTH表示客户端传输数据的字节数。
*CONTENT-TYPE
CONTENT-TYPE表示客户端传输数据的数据编码类型。
利用-environ(int)函数可以获得所有的环境变量及其值;利用getenv(constchar*)函数可以获得指定环境变量的相应值。
2、HTTP请求方法
客户端用户代理提交的CGI请求是HTTP请求,其中包括HTTP请求方法。HTTP协议定义的请求方法中常用的主要有GET和POST。客户端FORM表的METHOD属性用来设置请求方法,其缺省值为GET。
如果在FORM中使用GET方法,CGI程序通过环境变量QUERY-STRING获取客户端传输数据。
如果在FORM中使用POST方法,CGI程序通过通过CONTENT-LENGTH获取客户端传输数据的字节数,通过Stdin读取客户端传输数据。

二、用户请求参数的提取和处理
通过GET方式传输请求参数时,一般格式为:
name[1]=value[1]&name[2]=value[2]&...name[i]=value[i]...name[n]=value[n]
其中name[i]表示变量名,它是在FORM表中某输入域的名字;value[i]表示变量值,它是用户在FORM表中某输入域中输入的值,这些参数放在环境变量中QUERY-STRING中,可以通过此变理来获取,现在的脚本程序一般都已经cgi内核处理完成,直接通过相应的函数获取即可,如php的$_GET和$_POST等。

三、web服务器向客户端返回应答
CGI程序处理结束后,通过标准输出流将应答信息传递给服务器,再由服务器返回给发出请求的客户端。其输出的应答信息是HTTP应答消息,它一般由两部分组成:应答头和应答数据。
常见的应答头包括三种头域:Content-Type(数据编码类型,用MIME类型表示),Location(特定文档的URL,这种情况不直接向客户端输出内容而输出该URL)和Status(处理结果的状态码和状态描述)。HTTP应答头由几行格式相同的文本构成,每行的基本格式为:”头域名:该域内容”。应答头和应答体之间用一空行加LF(或CR/LF)分隔。应答体为CGI扩展程序的输出数据,其数据类型应该与Content-Type值相一致。
CGI程序的输出可以用printf()、puts()等标准I/O函数来实现。

四、CGI程序语言的选择
在开发CGI程序过程中,可根据实际情况(服务器提供的接口、实际需求和程序员经验等)选择编程语言,如C、C++、Perl、php等。如果选用C/C++等语言,必须编译成可执行文件;如果选用Perl、php等解释语言,服务器需要通过调用脚本相应的解释器来处理,如php的解释器其实就是php5.exe(windows)这个exe文件,linux下的php5可执行文件。

五、常用的web服务器与cgi的组合

apache+mod_php5+php、nginx+php-fpm+php,apache通过内嵌lib来扩展调用php的cgi脚本,而nginx通过调用php的cgi脚本而完成请求响应。

转载自:顶点博客>> web服务器与cgi程序最佳组合

 

 

对于CGI来说,处理表单是它的重头戏,今天我们来看看CGI如何处理HTML的表单。

处理表单(GET

现在大多数的CGI脚本用来处理表单输入,处理表单的过程和上面直接在URL中调用CGI脚本的情况有些不同。一个表单通常分为两个部分:HTML表单格式和处理数据的脚本,处理程序由<FROM>标签的ACTION属性指定,每个输入区都有一个NAME属性用来称呼表单元素,当表单数据被递交给ACTION中定义的处理程序时,NAME和其输入内容被以数字或字符的形式保存在环境变量中,脚本程序再通过读取环境变量的方式获得用户输入,根据编程语言的不同获取环境变量的方式也不同,C语言中可以通过stdlib库函数getenv来获得环境变量。

表单从浏览器发给服务器有两种方法(METHOD属性):GET和POST。GET方法将数据打包放在环境变量QUERY_STRING中作为URL整体的一部分传递给服务器。POST做很多类型GET的事情,但是它分离地传递数据给脚本的,程序要通过标准输入或得数据,POST方式不会改变数据,也就是说同样的数据可以多次提交而不必重新输入。当数据量超过1024时只能使用POST来传递,由于GET将数据直接放到URL中,数据的传输也就变得很不安全了。

表单输入的数据通过URL编码后传输到服务器端,我们有必要了解一下URL的编码规则:

1、  每个name/value以name=valu的形式配对出现,每对name/valu之间用&分隔

2、  若用户没有对某个name赋值,则以“name=”的形式出现

3、  任何特殊字符以百分号%用十六进制编码。

4、  输入区的空格将以“+”显示

要想得到用户输入的数据就必须对传递进来的URL编码进行解码,解码有很多工具可用,比如CGIC库中就已经对解

posted on 2015-09-29 16:58  小西红柿  阅读(2320)  评论(0编辑  收藏  举报

导航