Apache CGI动态内容
CGI(公共网关接口)定义了Web服务器与外部内容生成程序交互的方式,这些程序通常被称为CGI程序或CGI脚本。这是一种使用您最熟悉的编程语言将动态内容放在网站上的简单方法。本文档将介绍如何在Apache Web服务器上设置CGI,以及如何编写简单的CGI程序。
1. 配置Apache以允许CGI
为了使CGI程序正常工作,需要配置Apache以允许CGI执行。有几种方法可以做到这一点。
方式1:ScriptAlias指令
ScriptAlias指令告诉Apache,为CGI程序留出了一个特定的目录。Apache将假定此目录中的每个文件都是CGI程序,并在客户端请求该特定资源时尝试执行该程序。
ScriptAlias
指令如下所示:
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
如果在默认位置安装了Apache,则显示的示例可在默认httpd.conf
配置文件找到。ScriptAlias指令很像Alias指令,它定义了一个映射到特定目录的URL前缀。Alias和ScriptAlias通常用于DocumentRoot目录之外的目录。Alias和ScriptAlias之间的区别在于ScriptAlias具有额外的含义,即该URL前缀下的所有内容都将被视为CGI程序。因此,上面的示例告诉Apache,对于以/cgi-bin/
开头的资源的任何请求都应该在目录/usr/local/apache2/cgi-bin/
中提供,并且应该被视为CGI程序。
例如,如果请求URL http://www.example.com/cgi-bin/test.pl
,Apache将尝试执行文件/usr/local/apache2/cgi-bin/test.pl
并返回输出。当然,该文件必须存在,并且是可执行的,并以特定方式返回输出,否则Apache将返回错误消息。
方式2:ScriptAlias目录之外的CGI
出于安全原因,CGI程序通常仅限于ScriptAlias的目录。通过这种方式,管理员可以严格控制允许谁使用CGI程序。但是,如果采取适当的安全预防措施,则没有理由不能从任意目录运行CGI程序。例如,您可能希望使用UserDir
指令让用户在其主目录中拥有Web内容。如果他们想拥有自己的CGI程序,但无法访问主cgi-bin
目录,则需要能够在其他地方运行CGI程序。
允许在任意目录中执行CGI有两个步骤。首先,必须使用AddHandler或SetHandler指令激活cgi-script
处理程序。其次,必须在Options
指令中指定ExecCGI
。
方式3:使用Options来允许CGI执行
可以在主服务器配置文件中明确使用Options
指令来指定在特定目录中允许CGI执行:
<Directory "/usr/local/apache2/htdocs/somedir">
Options +ExecCGI
</Directory>
上述指令告诉Apache允许执行CGI文件。还需要告诉服务器哪些文件是CGI文件。以下AddHandler
指令告诉服务器将所有带有cgi或pl扩展名的文件视为CGI程序:
AddHandler cgi-script .cgi .pl
方式4:用户目录
要允许在用户目录中以.cgi
结尾的任何文件执行CGI程序,可以使用以下配置。
<Directory "/home/*/public_html">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
如果您希望指定用户目录的cgi-bin
子目录,其中所有内容都将被视为CGI程序,则可以使用以下命令。
<Directory "/home/*/public_html/cgi-bin">
Options ExecCGI
SetHandler cgi-script
</Directory>
2. 编写CGI程序
“常规”编程和CGI编程有两个主要区别。
首先,CGI程序的所有输出必须以MIME
类型标头开头。这是HTTP标头,告诉客户端它接收的内容类型。在大多数情况下是这样的:
Content-type: text/html
其次,输出需要使用HTML或浏览器能够显示的其他格式。大多数情况下将是HTML,但有时您可能会编写一个CGI程序来输出gif
图像或其他非HTML内容。
除了这两件事,编写CGI程序看起来很像你可能编写的任何其他程序。
第一个CGI程序
以下是一个示例CGI程序,它将一行内容输出到浏览器。输入以下内容,将其保存到名为first.pl
的文件中,并将其放在cgi-bin
目录中。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";
即使您不熟悉Perl,也应该能够知道程序的含义。第一行告诉Apache(或者您正在运行的任何shell),可以通过将文件提供给位于/usr/bin/perl
位置的解释器来执行此程序。第二行是打印内容类型声明,然后是两个回车换行换行符。这会在标题后面添加一个空行,以指示HTTP标题的结尾和正文的开头。第三行打印字符串“Hello,World”。
如果打开浏览器并输入URL地址 -
http://www.example.com/cgi-bin/first.pl
或者无论你把文件放在哪里,都会看到一行Hello,World
。出现在浏览器窗口中。