学习笔记,非纯原创
1. CGI 是什么
CGI(Common Gateway Interface)
,通用网关接口,是 Web 服务器和 CGI 程序通信的一套标准。
当客户端发出 CGI 请求时,服务器寻找并执行相应的 CGI 程序。依照 CGI 接口,Web 服务器通过设置一系列预定义好的环境变量,将客户端提交的信息转交给服务器端的 CGI 程序进行处理。CGI 程序从环境变量和标准输入中读取数据并处理。最后向标准输出中输出数据,Web 服务器返回结果给客户端。
CGI 程序可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量,可以是 Python 脚本,PERL 脚本,SHELL 脚本,C 或者 C++ 程序等。
2. 原理
2.1. 环境变量
CGI 程序继承了系统的环境变量。下表列出了几个重要的环境变量。
变量名 | 描述 |
---|---|
REQUEST_METHOD | POST 或 GET, 取决于客户端是怎样向服务器传递数据的,信息可从 http header 首行 method 获取,详见「http 报文解析」 |
CONTENT_LENGTH | 如果信息的传递方式是 POST,则该变量是必须的,用于服务器告知 CGI 程序从 stdin 中可以读到的有效数据的字节数 |
QUERY_STRING | 如果信息的传递方式是 GET,则该变量是必须的,服务器将客户端传递的信息存储在其中供 CGI 查询。例如 .../color.cgi?color=red 中 ? 后的内容(不包括 ? ) |
2.2. 处理流程
- 在执行 CGI 程序前,服务器把客户端传来的信息保存到环境变量里,并调用 CGI 程序。
- CGI 程序解析环境变量。首先查看
REQUEST_METHOD
,如果是POST
,就意味着客户端来的用户数据存放在 CGI 进程的 stdin 中,同时用户数据的长度存储在CONTENT_LENGTH
环境变量中,程序到该进程相应的标准输入取出CONTENT_LENGTH
长的数据即可;如果是GET
,则意味着服务器将用户数据存储在了QUERY_STRING
环境变量里。 - 根据取出的用户数据执行相应的操作,写到 stdout 中
- 服务器获取 CGI 程序输出并回复客户端。
CGI 使用实例参见文章 Web Server 201 - 剖析 tiny-httpd