文章摘自https://blog.csdn.net/nyist327/article/details/41049699
CGI是Web服务器和外部程序之间的一个接口。利用CGI程序可以处理从Web上客户端发送出来的表单和数据,并对此做出相关操作。这种反应可以是HTML文件、图片、声音、视频等可以在浏览器窗体上出现的任何数据。通用网关接口有两个含义。首先它为客户端用户通过www获取Internet上的其他服务,例如Archie、WAIS、Database等提供了一个接口,虽然不能直接在www上访问这些服务,但是您可以通过一个CGI程序和Web服务器访问它们。其次它就是您编写的程序和Web服务器间的接口标准。您所编写的处理客户端有关信息的程序必须遵循这个标准。
那么,CGI是如何在客户端的Web浏览器(如Netscape Navigator)和Web服务器(如NSCA HTTPd)间工作的呢?
当客户端的浏览器向Web服务器请求一个HTML文件时,服务器在收到请求后就去寻找这个文件并将找到的文件传送给客户端。而当客户端的请求是一个CGI程序时,Web服务器将激活客户端所请求的CGI程序。此时Web服务器所起的作用就好像是客户端和CGI程序间的中间人,如图所示。CGI程序的工作一般可以分为以下几个步骤。
1.客户端发出请求
首先,客户端的浏览器发出一个请求给Web服务器。如果这个请求是一个普通的文件(例如HTML文件、GIF或JPEG文件),Web服务器就将文件直接传送给客户端的浏览器。如果这个请求是一个CGI程序或外部应用,Web服务器将激活相应的CGI程序。例如:客户端传送来的请求可能是对一个数据库的检索,此时一个相应的CGI程序将被Web服务器激活,这个CGI程序将根据客户端要求的准则去检索相应的数据库,并通过Web服务器将结果传送给客户端。
2. Web服务器激活CGI程序
当Web服务器发现客户端浏览器传送来的请求不是一个普通文件而是一个CGI程序时,Web服务器就要激活这个CGI程序并执行它(比如:http://www.example.com/wiki.cgi)。
在这个CGI程序被执行前,Web服务器要为该CGI程序设置一些环境变量。这些环境变量被服务器用来向CGI程序传递一些非常重要的信息,例如当前Web服务器的状态、谁发出的调用等等。Web服务器为CGI程序所设置的环境变量的使用和正常的环境变量的使用没有任何区别。当CGI程序运行结束时,Web服务器为它设置的环境变量也随着消失。
每个被激活的CGI程序都有自己唯一的一组环境变量。事实上对于一个非常繁忙的Web服务器,可能同时会有同一个CGI程序的很多个进程在运行,这时每个CGI程序的进程都有自己的运行环境,互不影响。
3. CGI程序对客户端的请求做出反应
CGI程序通过环境变量或其他途经读取Web服务器所提供的客户端的输入数据并对这些数据进行处理,如果有必要CGI程序还要和一些外部的服务例如Archie、WAIS和Database等发生联系。最后CGI程序将通过Web服务器将处理结果传送给客户端。CGI程序可以根据需要产生各种类型的数据。
4. Web服务器将CGI程序的处理结果传送给客户端
Web服务器收到了CGI程序的处理结果后将对CGI程序的输出进行检查,如有必要,将为CCI程序的输出结果加上一些HTTP协议所必须的HTTP头信息。检查完成后将把CGI程序的输出传送给客户端。
5. Web服务器中断和客户端浏览器的连接。
6. Web浏览器将CGI程序的输出显示在浏览器的窗体上。