Apache 模块 mod_cgi

Description:CGI 脚本的执行
Status:Base
Module Identifier:cgi_module
Source File:mod_cgi.c

Summary

具有处理程序cgi-script的任何文件都将被视为 CGI 脚本,并由服务器运行,并将其输出返回给 Client 端。文件通过具有包含由AddHandler指令定义的 extensions 的名称或位于ScriptAlias目录中来获取此处理程序。

有关在 Apache 上使用 CGI 脚本的介绍,请参见使用 CGI 的动态内容上的教程。

在 unix 下使用多线程 MPM 时,应使用模块mod_cgid代替该模块。在用户级别,这两个模块基本相同。

为了向后兼容,还将为任何 mime 类型application/x-httpd-cgi的文件激活 cgi-script 处理程序。不建议使用 magic mime 类型。

CGI 环境变量

服务器将按照CGI specification中的说明设置 CGI 环境变量,并具有以下规定:

  • PATH_INFO

    • 如果AcceptPathInfo指令显式设置为off,则此功能将不可用。如果未提供AcceptPathInfo,则默认行为是mod_cgi将接受路径信息(在 URI 中的脚本文件名之后跟踪/more/path/info),而核心服务器将为带有附加路径信息的请求返回 404 NOT FOUND 错误。省略AcceptPathInfo指令与将On设置为mod_cgi请求的效果相同。
  • REMOTE_HOST

    • 仅当将HostnameLookups设置为on(默认情况下处于关闭状态)并且访问主机地址的反向 DNS 查找确实找到了主机名时,才设置此选项。
  • REMOTE_IDENT

    • 仅当IdentityCheck设置为on并且访问主机支持 ident 协议时才设置。请注意,由于可以轻易地伪造该变量的内容,因此不能依赖该变量的内容,并且如果 Client 端和服务器之间存在代理,则通常完全没有用。
  • REMOTE_USER

    • 仅当 CGI 脚本需要验证时才设置。

该模块还利用核心函数ap_add_common_varsap_add_cgi_vars来添加环境变量,例如:

  • DOCUMENT_ROOT

  • SERVER_NAME

    • 与请求相关的标准域名。
  • SERVER_ADDR

    • 服务请求的虚拟主机的 IP 地址。
  • SERVER_ADMIN

对于详尽的列表,建议编写一个基本的 CGI 脚本,该脚本以方便的格式转储 Apache 传递的所有环境变量。

CGI Debugging

传统上,调试 CGI 脚本很困难,主要是因为无法研究无法正常运行的脚本的输出(标准输出和错误)。这些指令可在发生错误时提供更详细的日志记录。

CGI 日志文件格式

配置后,CGI 错误日志会记录任何无法正常执行的 CGI。每个无法运行的 CGI 脚本都会记录多行信息。前两行始终采用以下格式:

%% [time] request-line %% HTTP-status CGI-script-filename

如果错误是无法运行 CGI 脚本,则日志文件将另外包含两行:

%%error error-message

或者,如果错误是脚本返回不正确的 Headers 信息(通常是由于脚本中的错误所致)的结果,则会记录以下信息:

%request All HTTP request headers received POST or PUT entity (if any) %response All headers output by the CGI script %stdout CGI standard output %stderr CGI standard error

(如果脚本在标准输出或标准错误上未输出任何内容,则可能缺少%stdout 和%stderr 部分)。

ScriptLog Directive

Description:CGI 脚本错误日志文件的位置
Syntax:ScriptLog file-path
Context:服务器配置,虚拟主机
Status:Base
Module:mod_cgi, mod_cgid

ScriptLog指令设置 CGI 脚本错误日志文件。如果未提供ScriptLog,则不会创建错误日志。如果给出,则任何 CGI 错误都将记录到作为参数给出的文件名中。如果这是相对文件或路径,则相对于ServerRoot采取。

Example

ScriptLog logs/cgi_log

该日志将以子进程运行的用户身份(即*在主User指令中指定的用户)打开。这意味着脚本日志所在的目录需要该用户可写,或者文件需要手动创建并设置为该用户可写。如果将脚本日志放置在主日志目录中,请执行 NOT 更改目录权限,以使其对运行子进程的用户可写。

请注意,脚本日志记录是编写 CGI 脚本时的调试功能,而不是在运行的服务器上连续激活。它不是针对速度或效率进行优化的,如果以非设计方式使用,可能会带来安全问题。

ScriptLogBuffer Directive

Description:将在脚本日志中记录的最大 PUT 或 POST 请求数量
Syntax:ScriptLogBuffer bytes
Default:ScriptLogBuffer 1024
Context:服务器配置,虚拟主机
Status:Base
Module:mod_cgi, mod_cgid

记录到文件中的任何 PUT 或 POST 实体主体的大小都受到限制,以防止如果接收到较大的主体,则日志文件会过快增大。默认情况下,最多记录 1024 个字节,但是可以使用此伪指令进行更改。

ScriptLogLength Directive

Description:CGI 脚本日志文件的大小限制
Syntax:ScriptLogLength bytes
Default:ScriptLogLength 10385760
Context:服务器配置,虚拟主机
Status:Base
Module:mod_cgi, mod_cgid

ScriptLogLength可用于限制 CGI 脚本日志文件的大小。由于该日志文件记录了每个 CGI 错误的大量信息(所有请求 Headers,所有脚本输出),因此它可以成长为一个大文件。为了防止无限增长引起的问题,可以使用此伪指令为 CGI 日志文件设置最大文件大小。如果文件超过此大小,将不会再写入任何信息。