26.5. 使 CGI 脚本运行

Apache 的通用网关接口 (CGI) 允许您使用程序或脚本(通常指 CGI 脚本)创建动态内容。可以用任何编程语言来编写 CGI 脚本。通常使用诸如 Perl 或 PHP 之类的脚本语言。

为了使 Apache 能够传递由 CGI 脚本创建的内容,需要激活 mod_cgi。还需要 mod_alias。默认情况下启用这两种模块。请参见第 26.4.2 节 “激活和取消激活”来获取有关激活模块的详细信息。

[Warning]CGI 安全性

允许服务器执行 CGI 脚本是一项潜在的安全性漏洞。其它信息请参见第 26.7 节 “避免安全性问题”

26.5.1. Apache 配置

在 SUSE Linux 中,仅允许在目录 /srv/www/cgi-bin/ 中执行 CGI 脚本。已配置此位置来执行 CGI 脚本。如果已经创建了虚拟主机配置(请参见第 26.2.1.2 节 “虚拟主机配置”)并且想将脚本放置在特定于主机的目录中,必须解锁并配置此目录。

例 26.5. VirtualHost CGI 配置

ScriptAlias /cgi-bin/ "/srv/www/example.com_cgi-bin/"1

<Directory "/srv/www/example.com_cgi-bin/">
 Options +ExecCGI2
 AddHandler cgi-script .cgi .pl3
 Order allow,deny4
 Allow from all
</Directory>
    
1

指示 Apache 在此目录中将所有文件作为 CGI 脚本处理。

2

启用 CGI 脚本执行

3

指示服务器将扩展名为 .pl 和 .cgi 的文件视为 CGI 脚本。根据需要进行调整。

4

Order Allow 指令将控制默认的访问状态及 Allow 和 Deny 指令的评估顺序。在这种情况下,“deny”语句将在“allow”语句之前评估,并且可以从任何位置处访问。

26.5.2. 运行示例脚本

CGI 编程不同于“常规”编程,因为 CGI 程序和脚本前面必须有一个 MIME 类型的标题,例如 Content-type:text/html。此标题将发送到客户机,所以它知道所接收的内容的类型。其次,脚本的输出必须是客户机(通常是万维网浏览器)所知道的,比如 HTML(大多数情况)、纯文本或图像。

/usr/share/doc/packages/apache2/test-cgi 下提供的简单测试脚本是 Apache 程序包的一部分。它将某些环境变量的内容输出为纯文本。将此脚本复制到 /srv/www/cgi-bin/ 或您虚拟主机的脚本目录 (/srv/www/example.com_cgi-bin/) 中,并将它命名为 test.cgi

用户 root 应该有可由万维网服务器访问的文件(请参见第 26.7 节 “避免安全性问题”获取其它信息)。由于该万维网服务器是由不同用户运行的,所以 CGI 脚本必须可被世界各地的用户执行和读取。更改为 CGI 目录并使用命令 chmod 755 test.cgi 来应用正确的权限。

现在调用 http://localhost/cgi-bin/test.cgihttp://example.com/cgi-bin/test.cgi。应该能看到“CGI/1.0 测试脚本报告”。

26.5.3. 查错

如果没有看到测试程序的输出而是看到了错误讯息,则请检查以下项:

CGI 查错

  • 是否在更改配置后重装载了服务器?请检查 rcapache2 probe

  • 如果已经配置了自定义 CGI 目录,那么该配置是否正确?如果不确定,请尝试默认 CGI 目录 /srv/www/cgi-bin/ 中的脚本并用 http://localhost/cgi-bin/test.cgi 调用它。

  • 文件权限是否正确?更改为 CGI 目录并执行 ls -l test.cgi。它的输出应该以下面的字符串开头

    -rwxr-xr-x  1 root root
         
  • 确保脚本中没有编程错误。如果还未更改 test.cgi,则问题应该不大,但是如果正在使用您自己的程序,则始终要确保它们中没有编程错误。