CGI是通用网关接口的简称,通过CGI可实现客户端浏览器与服务器之间数据的交互。
CGI通信系统由显示在前端的HTML页面以及运行在服务端上的cgi程序组成。web客户端显示的是相关的html文件,这些文件一般存储在目录/www下,CGI程序一般为后缀是.cgi的文件,存储路径一般也是/www。
CGI通信系统的结构框图如下:
步骤1:web客户端对服务器发起HTTP请求;
步骤2:环境变量向CGI程序发送数据;
步骤3:重定向CGI标准输出到管道,服务器通过管道获取CGI输出数据;
步骤4:服务器向客户端发送HTTP响应结果;
在web客户端与服务器CGI程序交互的过程中,需前置以下条件:第一,解析GET表单,建立环境变量;第二,建立服务器与CGI程序之间的通信管道,重定向CGI程序标准输出到服务器的管道读端口。
客户端发起HTTP请求时,浏览器向服务器发送一个URL,服务器根据URL指向一个应用程序,服务器执行哪些cgi程序由浏览器发起的请求决定。每个CGI程序只能处理一个用户请求,在激活一个CGI程序进程时创建属于该进程的环境变量。
以下是一个前端页面提交表单的例子,代码如下:
<div class="login">
<form method="post" action="/checklogin.cgi">
<div class="item user"><input type="text" placeholder="请输入用户名" name="username" id="username"/></div>
<div class="item pass"><input type="password" placeholder="请输入密码" name="password" id="password"/></div>
<div class="btn"><button type="submit">登录</div>
</form>
</div>
通过POST的方式将用户名和密码传递给checklogin.cgi程序,客户端来的用户数据将存放在CGI进程的标准输入中,同时将用户数据的长度赋予环境变量中的CONTENT_LENGTH,客户端用POST方式发送数据有一个相应的MIME类型,该类型记录在环境变量CONTENT_TYPE中,由checklogin.cgi验证用户名和密码的正确性,验证结束后根据业务逻辑再实现页面的跳转。
CGI程序被HTTP服务器调用时,环境变量中包含了很多有用信息, 包括当前的URL,GET参数,客户端IP地址,请求头等等信息。相关环境变量如下:
REQUEST_METHOD | 服务器与CGI程序之间的信息传输方式 |
QUERY_STRING | 采用GET时所传输的信息 |
CONTENT_LENGTH | STDIO中的有效信息长度 |
CONTENT_TYPE | 指示所传来的信息的MIME类型 |
CONTENT_FILE | 使用Windows HTTPd/WinCGI标准时,用来传送数据的文件名 |
PATH_INFO | 路径信息 |
PATH_TRANSLATED | CGI程序的完整路径名 |
SCRIPT_NAME | 所调用的CGI程序的名 |
环境变量是一个保存用户信息的内存区。当客户端通过浏览器发出CGI请求时,服务器就寻找本地的相应CGI程序并执行它。在执行CGI程序的同时,服务器把该用户的信息保存到环境变量里。CGI程序首先查询服务器与CGI程序之间的信息传输方式REQUEST_METHOD,如果是POST,就从环境变量的len,然后到该进程相应的标准输入取出len长的数据。如果是GET,则用户数据就在环境变量的QUERY_STRING。
## 最后推荐一个公众号,一枚IT技术人成长路上关于生活和职场的思考,欢迎书友们前来交流和分享心得