<?xml version="1.0" encoding="iso-2022-jp"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.ja.xsl"?>
<modulesynopsis>
<!-- English revision: 1.6 -->

<name>mod_cgi</name>
<description>CGI スクリプトの実行</description>
<status>Base</status>
<sourcefile>mod_cgi.c</sourcefile>
<identifier>cgi_module</identifier>

<summary>
    <!-- XXX: Should have references to CGI definition/RFC -->
    <!-- XXX: Should mention Options ExecCGI  -->
    <!-- XXX: Should mention AcceptPathInfo   -->

    <p>Mime タイプが <code>application/x-httpd-cgi</code> 
    であるか、ハンドラ <code>cgi-script</code> (Apache 1.1 以降)
    が指定されているファイルは CGI スクリプトとして扱われ、
    サーバにより実行され、その出力がクライアントに返されます。
    ファイルは、<directive module="mod_mime">AddType</directive>
    ディレクティブに指定された 拡張子を名前に含むか、
    <directive module="mod_alias">ScriptAlias</directive>
    ディレクトリに存在することによりこのタイプになります。</p>

    <p>サーバが CGI スクリプトを実行するときには、
    <code>DOCUMENT_ROOT</code>
    と呼ばれる変数を環境に追加します。この変数は
    <directive module="core">DocumentRoot</directive>
    の値を保持します。</p>

    <p>Apache で CGI スクリプトを使用するためのイントロダクションは、
    <a href="../howto/cgi.html">CGI による動的コンテンツ</a>
    を参照してください。</p>

    <p>Unix でマルチスレッドの MPM を使っている場合は、このモジュールの
    代わりに <module>mod_cgid</module> を使う必要があります。
    ユーザレベルではこの二つのモジュールは本質的には同一です。</p>
</summary>

<seealso><directive module="core">Options</directive></seealso>
<seealso><directive module="mod_alias">ScriptAlias</directive></seealso>
<seealso><directive module="mod_mime">AddHandler</directive></seealso>

<section><title>CGI 環境変数</title>
    <p>サーバは <a href="http://hoohoo.ncsa.uiuc.edu/cgi/">CGI
    規格</a> で決められている CGI
    環境変数を設定します。以下のものは、条件付きで設定されます。</p>

    <dl>
      <dt>PATH_INFO</dt>

      <dd>これは <directive module="core"
      >AcceptPathInfo</directive> ディレクティブが明示的に <code>off</code>
      に設定されている場合は設定されません。デフォルトの、AcceptPathInfo が
      指定されていないときの振る舞いでは、mod_cgi はパス情報
      (URI のスクリプトのファイル名の後に続く /more/path/info) を
      受け付けますが、コアはサーバはパス情報のあるリクエストに
      対して 404 NOT FOUND エラーを返します。AcceptPathInfo ディレクティブを
      省略すると、mod_cgi へのリクエストに対して <code>on</code> を
      設定したのと同じ効果になります。</dd>

      <dt>REMOTE_HOST</dt>

      <dd><directive module="core">HostnameLookups</directive>
      が <code>on</code> (デフォルトでは off です)
      で、アクセスしているホストのアドレスの DNS
      の逆引きが実際にホスト名を見つけたときにのみ設定されます。</dd>

      <dt>REMOTE_IDENT</dt>

      <dd><directive module="core">IdentityCheck</directive>
      が <code>on</code> に設定されていて、アクセスしているホストが
      ident プロトコルをサポートしているときにのみ設定されます。
      これは簡単に偽ることができ、クライアントとサーバの間に
      プロキシがあればまったく役に立たないので、
      この変数の値は信用できないということに注意してください。
      </dd>

      <dt>REMOTE_USER</dt>

      <dd>CGI
      スクリプトに認証が必要なときにのみ設定されます。</dd>
    </dl>
</section>

<section id="cgi_debug"><title>CGI のデバッグ</title>
    <p>CGI スクリプトのデバッグは、正しく動作していないスクリプトの出力
    (標準出力とエラー)
    を調べることができないために、難しい状態が続いていました。
    これらの Apache 1.2 以降にある
    ディレクティブはより詳細なエラーのログ収集を提供します。</p>

<section><title>CGI ログファイルの書式</title>
    <p>設定されているときには、CGI エラーログは適切に動作しないすべての
    CGI をログ収集します。それぞれの正しく動作しない CGI
    スクリプトは 複数の行にわたる情報がログ収集されます。最初の
    2 行は常に以下の書式です:</p>
<example>
  %% [<em>time</em>] <em>request-line</em><br />
  %% <em>HTTP-status</em> <em>CGI-script-filename</em>
</example>
    <p>エラーが、CGI スクリプトが実行できないというものである場合は、
    ログファイルはさらにもう 2 行書かれます:</p>
<example>
  %%error<br />
  <em>error-message</em>
</example>
    <p>そうではなく、エラーが正しくないヘッダ情報を返す結果である場合
    (スクリプトのバグであることがよくあります)、
    以下の情報がログ収集されます:</p>
<example>
  %request<br />
  <em>受け取ったすべての HTTP リクエストヘッダ</em><br />
  <em>(もしあれば) POST や PUT の中身</em><br />
  %response<br />
  <em>CGI スクリプトにより出力されたすべてのヘッダ</em><br />
  %stdout<br />
  <em>CGI 標準出力</em><br />
  %stderr<br />
  <em>CGI 標準エラー</em><br />
</example>
    <p>(スクリプトが標準出力や標準エラーに何も出力しなかった場合は、
    %stdout や %stderr はありません)。</p>
</section>
</section>

<directivesynopsis>
<name>ScriptLog</name>
<description>CGI スクリプトのエラーログファイルの場所</description>
<syntax>ScriptLog <em>file-path</em></syntax>
<contextlist><context>サーバ設定ファイル</context>
<context>バーチャルホスト</context>
</contextlist>
<modulelist><module>mod_cgi</module><module>mod_cgid</module>
</modulelist>

<usage>
    <p><directive>ScriptLog</directive> ディレクティブは CGI スクリプトの
    エラーログファイルを設定します。ScriptLog が設定されていないときは、
    エラーログは作成されません。設定されているときは、CGI
    のエラーはすべて引数として与えられているファイル名にログされます。
    相対パスで指定されているときは、
    <code>ServerRoot</code>からの相対パスとして扱われます。</p>

    <example><title>例</title>
    ScriptLog logs/cgi_log
    </example>

    <p>このログは子プロセスが実行されているユーザとしてオープンされます。
    すなわち、<directive module="mpm_commmon">User</directive> ディレクティブ
    で指定された
    ユーザです。これは、スクリプトログが書かれるディレクトリがそのユーザで
    書き込み可能か、スクリプトファイルが手動で作成され、そのユーザで
    書き込み可能になっている必要があるということです。スクリプトログを
    アクセスログなどのためのログディレクトリに書かれるようにしたときは、
    そのディレクトリを子プロセスを実行しているユーザの権限で
    書き込み可能には<strong>しない</strong>ようにしてください。</p>

    <p>スクリプトのログ収集は CGI スクリプトを書くときの
    デバッグ用の機能として意図されていて、通常のサーバで
    常に使用されるようには意図されていないということに注意してください。
    速度や効率は最適化されておらず、設計された以外の方法で使用されると
    セキュリティの問題があるかもしれません。</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>ScriptLogLength</name>
<description>CGI スクリプトのログファイルの大きさの上限</description>
<syntax>ScriptLogLength <em>bytes</em></syntax>
<default>ScriptLogLength 10385760</default>
<contextlist><context>サーバ設定ファイル</context>
<context>バーチャルホスト</context>
</contextlist>
<modulelist><module>mod_cgi</module><module>mod_cgid</module>
</modulelist>

<usage>
    <p><directive>ScriptLogLength</directive> は CGI スクリプトのログファイル
    の大きさを制限するために使用することができます。ログファイルは
    CGI のエラー毎に大量の情報 (リクエストのすべてのヘッダ、
    すべての出力)をログしますので、すぐに大きなファイルになります。
    この大きさの制限がないことによる問題を防ぐために、
    このディレクティブを使って CGI のログファイルの
    最大のファイルサイズを設定することができます。
    ファイルがこの大きさを超えた場合は、それ以上は書き込まれません。</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>ScriptLogBuffer</name>
<description>スクリプトログに記録される PUT や POST リクエストの内容の上限</description>
<syntax>ScriptLogBuffer <em>bytes</em></syntax>
<default>ScriptLogBuffer 1024</default>
<contextlist><context>サーバ設定ファイル</context>
<context>バーチャルホスト</context>
</contextlist>
<modulelist><module>mod_cgi</module><module>mod_cgid</module>
</modulelist>

<usage>
    <p>大きな本体を受け取ったときにログファイルがすぐに大きくなりすぎる
    問題を避けるために、ファイルにログ収集される PUT と POST
    の本体の大きさは制限されています。デフォルトでは、1024
    バイトまでがログ収集されますが、
    このディレクティブはそれを変更することができます。 
    </p>
</usage>
</directivesynopsis>

</modulesynopsis>
