📄 mod_cgi.html
字号:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="Apache, 中文, 手册, 中文版, 中文手册, 中文版手册, 参考手册, 中文参考手册, 金步国" />
<meta name="description" content="Apache 2.2 中文版参考手册" />
<meta name="author" content="金步国" />
<link href="../style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>mod_cgi - Apache 2.2 中文版参考手册</title>
</head>
<body><div id="page-header">
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="../images/feather.gif" /></div>
<div class="up"><a href="./index.html"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
<div id="path"><a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">文档</a> > <a href="../index.html">版本2.2</a> > <a href="./index.html">模块</a></div>
<div id="translation-info"> <a href="../translator_announcement.html#thanks">致谢</a> | <a href="../translator_announcement.html#announcement">译者声明</a> | 本篇译者:<a href="mailto:csfrank@citiz.net">金步国</a> | 本篇译稿最后更新:2006年1月24日 | <a href="../translator_announcement.html#last_new">获取最新版本</a></div>
<div id="page-content"><div id="preamble"><h1>Apache模块 mod_cgi</h1>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="module">
<tr><th><a href="module-dict.html#Description">说明</a></th><td>在非线程型MPM(<code class="module"><a href="../mod/prefork.html">prefork</a></code>)上提供对CGI脚本执行的支持</td></tr>
<tr><th><a href="module-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">模块名</a></th><td>cgi_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">源文件</a></th><td>mod_cgi.c</td></tr>
</table>
<h3>概述</h3>
<p>任何具有MIME类型<code>application/x-httpd-cgi</code>或者被<code>cgi-script</code>处理器处理的文件都将被作为CGI脚本对待并由服务器运行,它的输出将被返回给客户端。可以通过两种途径使文件成为CGI脚本,一种是文件具有已由<code class="directive"><a href="../mod/mod_mime.html#addtype">AddType</a></code>指令定义的扩展名,另一种是文件位于<code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>目录中。</p>
<p>当服务器调用一个CGI脚本时会往运行环境中添加一个叫做<code>DOCUMENT_ROOT</code>的变量。这个变量将包含<code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>指令的值。</p>
<p>要得到对Apache中使用CGI脚本的介绍,参看<a href="../howto/cgi.html">使用CGI产生动态内容</a>。</p>
<p>在UNIX下使用多线程型的MPM时,应该使用模块<code class="module"><a href="../mod/mod_cgid.html">mod_cgid</a></code>代替本模块。在用户层面,这两个模块本质上是相同的。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="env" id="env">CGI环境变量</a></h2>
<p>Apache将按照<a href="http://hoohoo.ncsa.uiuc.edu/cgi/">CGI规范</a>设置环境变量,有以下几个:</p>
<dl>
<dt>PATH_INFO</dt>
<dd>如果显式设置了<code class="directive"><a href="../mod/core.html#acceptpathinfo">AcceptPathInfo</a></code>指令为 <code>off</code> ,这个变量将不可用。如果没有明确设置<code class="directive">AcceptPathInfo</code> ,默认的行为是<code class="module"><a href="../mod/mod_cgi.html">mod_cgi</a></code>将会接受路径信息(URI里脚本文件名之后的<code>/more/path/info</code>),即使服务器核心对请求的附加路径信息返回"404 NOT FOUND"错误。省略<code class="directive">AcceptPathInfo</code>指令与将它设置为 <code>On</code> 对<code class="module"><a href="../mod/mod_cgi.html">mod_cgi</a></code>请求具有相同的效果。</dd>
<dt>REMOTE_HOST</dt>
<dd>这个变量只有在<code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code>指令被设置为"<code>on</code>"(默认是"off")并且对访问主机的DNS反查确实找到了主机名时才被设置。</dd>
<dt>REMOTE_IDENT</dt>
<dd>这个变量只有在<code class="directive"><a href="../mod/core.html#identitycheck">IdentityCheck</a></code>被设置为 <code>on</code> 并且访问主机支持识别协议时才被设置。注意这个变量不能信赖,因为它很容易被假冒。而且如果客户端与服务器之间存在代理的话,这个变量通常完全没有用处。</dd>
<dt>REMOTE_USER</dt>
<dd>这个变量只有当CGI脚本需要身份验证时才被设置。</dd>
</dl>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="cgi-debug" id="cgi-debug">CGI脚本的调试</a></h2>
<p>调试CGI脚本一直以来都很困难,主要是因为在脚本不能正确运行时不可能研究它的输出(stdout和stderr)。这些指令为发生错误时提供了更详细的错误日志。</p>
<h3>CGI日志文件格式</h3>
<p>配置好以后,CGI错误日志会记录任何没有正确运行的CGI。每个运行失败的CGI脚本都有几行信息被记录。头两行总是这样的格式:</p>
<div class="example"><p><code>
%% [<var>time</var>] <var>request-line</var><br />
%% <var>HTTP-status</var> <var>CGI-script-filename</var>
</code></p></div>
<p>如果错误是CGI脚本无法执行,日志文件会包含以下额外的两行:</p>
<div class="example"><p><code>
%%error<br />
<var>error-message</var>
</code></p></div>
<p>或者,如果错误是脚本执行结果返回了不正确的头信息(经常是由于脚本内部的bug),会记录以下两行:</p>
<div class="example"><p><code>
%request<br />
<var>All HTTP request headers received</var><br />
<var>POST or PUT entity (if any)</var><br />
%response<br />
<var>All headers output by the CGI script</var><br />
%stdout<br />
<var>CGI standard output</var><br />
%stderr<br />
<var>CGI standard error</var><br />
</code></p></div>
<p>如果脚本没有在stdout和stderr上输出可能会没有%stdout和%stderr部分。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ScriptLog" id="ScriptLog">ScriptLog</a> <a name="scriptlog" id="scriptlog">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>CGI脚本错误日志文件的位置</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ScriptLog <var>file-path</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td><code class="module"><a href="../mod/mod_cgi.html">mod_cgi</a></code>, <code class="module"><a href="../mod/mod_cgid.html">mod_cgid</a></code></td></tr>
</table>
<p><code class="directive">ScriptLog</code>指令设置了CGI脚本错误日志文件的位置。如果没有设置<code class="directive">ScriptLog</code> ,就不会创建错误日志。如果设置了,所有CGI错误都会被记入作为指令参数的文件中。如果是一个相对路径则以<code class="directive"><a href="../mod/core.html#serverroot">ServerRoot</a></code>为参照。</p>
<div class="example"><h3>示例</h3><p><code>
ScriptLog logs/cgi_log
</code></p></div>
<p>此日志会以运行子进程的用户身份打开,比如由主服务器配置部分的<code class="directive"><a href="../mod/mpm_common.html#user">User</a></code>指令指定的用户。这意味着,或者该用户对脚本日志所在目录具有写权限,或者日志文件由此用户手工创建并设置为可写。如果你把脚本日志放在你的主日志目录中,<strong>不要</strong>为了让运行子进程的用户可以写日志而改变目录的权限。</p>
<p>注意,脚本日志是为了给创建CGI脚本提供一个调试特性,而不是要在运行服务时持续保持活动状态。它没有为速度或是效率作优化,而且与专门设计的那些特性不同,在某种程度上它会存在安全问题。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ScriptLogBuffer" id="ScriptLogBuffer">ScriptLogBuffer</a> <a name="scriptlogbuffer" id="scriptlogbuffer">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>记入日志文件的PUT或POST请求头的最大数量</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ScriptLogBuffer <var>bytes</var></code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>ScriptLogBuffer 1024</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td><code class="module"><a href="../mod/mod_cgi.html">mod_cgi</a></code>, <code class="module"><a href="../mod/mod_cgid.html">mod_cgid</a></code></td></tr>
</table>
<p>限制记入日志文件的PUT或者POST内容的大小,防止如果接收到很大内容时日志文件的尺寸增加得太快太大。默认地,最多纪录1024字节,但这个数字可以用此指令改变。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ScriptLogLength" id="ScriptLogLength">ScriptLogLength</a> <a name="scriptloglength" id="scriptloglength">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>日志文件的大小限制(字节)</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ScriptLogLength <var>bytes</var></code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>ScriptLogLength 10385760</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td><code class="module"><a href="../mod/mod_cgi.html">mod_cgi</a></code>, <code class="module"><a href="../mod/mod_cgid.html">mod_cgid</a></code></td></tr>
</table>
<p><code class="directive">ScriptLogLength</code>指令可以用于限制CGI脚本文件的大小。由于日志文件对每个CGI错误纪录(所有请求头、所有脚本输出)许多信息,它有可能会变成一个很大的文件。为了防止无限制的增长引起的问题,这个指令可以用来给CGI日志文件的大小设置一个上限。如果文件大小达到了这个限制,就不会再有信息被写入日志。</p>
</div>
</div>
<div id="footer">
<p class="apache">本文允许自由使用、分发、转载,但必须保留译者署名;详见:<a href="../translator_announcement.html#announcement">译者声明</a>。</p>
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p></div>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -