📜  通用网关接口 (CGI)(1)

📅  最后修改于: 2023-12-03 15:28:23.193000             🧑  作者: Mango

通用网关接口 (CGI)

什么是CGI?

通用网关接口(CGI,Common Gateway Interface)是Web服务器与应用程序之间进行交互的协议。它定义了Web服务器如何传递应用程序的请求以及如何从应用程序接收响应的方法。

CGI程序是一种能够接受客户端(通常是Web浏览器)请求的应用程序。当客户端请求特定的网址时,Web服务器将调用相关的CGI程序,并将请求信息传递给它。CGI程序经过处理后,返回HTML等数据到Web服务器并响应客户端请求。

CGI的工作原理

当您访问某个CGI脚本时,它是作为Web服务器上在Web服务器和正在运行的CGI脚本之间的一个翻译机构。

CGI工作流程

CGI的语言选择

可以使用各种语言来编写CGI程序,例如Perl, C, C++, Python等等。最常使用的是Perl,因为它可以轻松地与Web服务器和其他系统进行交互。C语言紧随其后,而其他编程语言的使用量较少。

以下是一个简单的使用Perl编写的CGI程序的示例:

#!/usr/bin/perl
use CGI qw(:standard);
print header;
print "<h1>Hello, World!</h1>";

在上面的示例中,#!/usr/bin/perl告诉服务器使用Perl来解释这个CGI脚本,use CGI qw(:standard)导入了CGI模块库,并使用print header来向客户端发送HTTP头信息,print "<h1>Hello, World!</h1>"则输出一个简单的HTML文档。

浏览器与CGI通信

当浏览器请求网站时,Web服务器会检查请求的文件类型。如果请求的文件是CGI脚本,服务器会执行该脚本,并向该脚本发送一些环境变量和标准输入。cgi-lib.pl是一组Perl库程序,用于解析从Web服务器发送过来的环境变量和标准输入。

例如,当HTTP请求的URL为http://example.com/cgi-bin/test.pl时,Web服务器执行test.pl文件。test.pl中的以下代码可以打印出从浏览器接收的GET请求:

print "Content-type: text/html\n\n";
print "<html><head><title>CGI Test</title></head><body>";
print "<p>";
@pairs = split(/&/, $ENV{QUERY_STRING});

foreach $pair (@pairs) {
  ($name, $value) = split(/=/, $pair);
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  print "$name: $value<br>";
}

print "</p></body></html>\n";

在上面的示例中,split(/&/, $ENV{QUERY_STRING});将接收到的查询字符串分割开来,$name变量保存查询名称,$value变量保存查询值。在此之后,这样的值可以传递给其他部分的程序并进行其他处理。