CGI原理

CGI(Common Gateway Interface)通用网关接口,CGI描述了服务器和请求处理程序之间传输数据局的一种标准。在理解的过程中我们需要区分CGI和CGI程序,CGI是一种数据传输的标准,而CGI程序是实际处理业务的一个程序。webserver每请求一次,CGI程序就会fork出一个子进程进行处理。CGI程序的参数通过环境变量和标准输入获得,它的相应通过标准输出传递给webServer。

CGI的工作原理是:

  • 客户端通过http将请求发送到web服务器
  • web服务器接收并收集用户请求,然后交给CGI程序进行处理
  • CGI程序把处理后的结果发送给服务器
  • 服务器将结果传送给浏览器

其中上述第二步web服务器通过环境变量或标准输入将请求发送给CGI程序,第三步CGI通过标准输出将结果发送给webServer

CGI接口标准:标准输入,环境变量以及标准输出

借口标准 介绍
标准输入 CGI程序像其他可执行程序一样,可通过标准输入(stdin)从Web服务器得到输入信息,如Form中的数据,这就是所谓的向CGI程序传递数据的POST方法。这意味着在操作系统命令行状态可执行CGI程序,对CGI程序进行调试。POST方法是常用的方法。
环境变量 操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了自己的一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法还通过环境变量QUERY-STRING向CGI程序传递Form中的数据。
标准输出 CGI程序通过标准输出(stdout)将输出信息传送给Web服务器。传送给Web服务器的信息可以用各种格式,通常是以纯文本或者HTML文本的形式,这样我们就可以在命令行状态调试CGI程序,并且得到它们的输出。

###常用的环境变量
Linux中的环境变量是一系列的键值对集合,它们的值可以通过shell设置,也可以被其他进程或程序设置和访问,它们是web服务器传递给CGI程序的一种最简单的方式,之所以叫做环境变量是因为它们是全局变量,任何程序都可以存取它们。

key 意义
SERVER_NAME CGI脚本运行时的主机名和IP地址
SERVER_SOFTWARE 你的服务器的类型如: CERN/3.0 或 NCSA/1.3.
GATEWAY_INTERFACE 运行的CGI版本. 对于UNIX服务器, 这是CGI/1.1
SERVER_PROTOCOL 服务器运行的HTTP协议. 这里当是HTTP/1.0.
SERVER_PORT 服务器运行的TCP口,通常Web服务器是80.
REQUEST_METHOD POST 或 GET, 取决于你的表单是怎样递交的
HTTP_ACCEPT 浏览器能直接接收的Content-types, 可以有HTTP Accept header定义.
HTTP_USER_AGENT 递交表单的浏览器的名称、版本 和其他平台性的附加信息。
HTTP_REFERER 递交表单的文本的 URL,不是所有的浏览器都发出这个信息,不要依赖它
PATH_INFO 附加的路径信息, 由浏览器通过GET方法发出.
PATH_TRANSLATED 在PATH_INFO中系统规定的路径信息.
SCRIPT_NAME 指向这个CGI脚本的路径, 是在URL中显示的(如, /cgi-bin/thescript).
QUERY_STRING 脚本参数或者表单输入项(如果是用GET递交). QUERY_STRING包含URL中问号后面的参数
REMOTE_HOST 递交脚本的主机名,这个值不能被设置.
REMOTE_ADDR 递交脚本的主机IP地址.
REMOTE_USER 递交脚本的用户名. 如果服务器的authentication被激活,这个值可以设置。
REMOTE_IDENT 如果Web服务器是在ident (一种确认用户连接你的协议)运行, 递交表单的系统也在运行ident, 这个变量就含有ident返回值.
CONTENT_TYPE 如果表单是用POST递交, 这个值将是 application/x-www-form-urlencoded. 在上载文件的表单中, content-type 是个 multipart/form-data.
CONTENT_LENGTH 对于用POST递交的表单,标准输入口的字节数.

CGI的工作原理图