On this page
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请求的效果相同。
- 如果AcceptPathInfo指令显式设置为
REMOTE_HOST
- 仅当将HostnameLookups设置为
on
(默认情况下处于关闭状态)并且访问主机地址的反向 DNS 查找确实找到了主机名时,才设置此选项。
- 仅当将HostnameLookups设置为
REMOTE_IDENT
- 仅当IdentityCheck设置为
on
并且访问主机支持 ident 协议时才设置。请注意,由于可以轻易地伪造该变量的内容,因此不能依赖该变量的内容,并且如果 Client 端和服务器之间存在代理,则通常完全没有用。
- 仅当IdentityCheck设置为
REMOTE_USER
- 仅当 CGI 脚本需要验证时才设置。
该模块还利用核心函数ap_add_common_vars和ap_add_cgi_vars来添加环境变量,例如:
DOCUMENT_ROOT
- 设置相关的DocumentRoot指令的内容。
SERVER_NAME
- 与请求相关的标准域名。
SERVER_ADDR
- 服务请求的虚拟主机的 IP 地址。
SERVER_ADMIN
- 设置相关的ServerAdmin指令的内容。
对于详尽的列表,建议编写一个基本的 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 日志文件设置最大文件大小。如果文件超过此大小,将不会再写入任何信息。