mod_cgi - Apache HTTP サーバ

Apache HTTP サーバ バージョン 2.4

Apache > HTTP サーバ > ドキュメンテーション > バージョン 2.4 > モジュール

# Apache モジュール mod_cgi

翻訳済み言語: en | fr | ja | ko

この日本語訳はすでに古くなっている 可能性があります。 最近更新された内容を見るには英語版をご覧下さい。

説明: | CGI スクリプトの実行
ステータス: | Base
モジュール識別子: | cgi_module
ソースファイル: | mod_cgi.c

### 概要

ハンドラ `cgi-script` が指定されているファイルは CGI スクリプトとして扱われ、 サーバにより実行され、その出力がクライアントに返されます。 ファイルは、`AddHandler` ディレクティブに指定された 拡張子を名前に含むか、 `ScriptAlias` ディレクトリに存在することによりこのハンドラになります。

Apache で CGI スクリプトを使用するためのイントロダクションは、 CGI による動的コンテンツ を参照してください。

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

後方互換性のため、 MIME タイプが `application/x-httpd-cgi` であるファイルでも cgi-script ハンドラが有効になります。この特殊な MIME タイプを 使う方法は非推奨です。

### ディレクティブ

### トピック

- CGI 環境変数
- CGI のデバッグ

### 参照

- `AcceptPathInfo`
- `Options`
- `ScriptAlias`
- `AddHandler`
- CGI プログラムを別のユーザ ID で実行する
- CGI 規格書

- コメント

## CGI 環境変数

サーバは CGI 規格 で決められている CGI 環境変数を設定します。以下のものは、条件付きで設定されます。

PATH_INFO
  これは `AcceptPathInfo` ディレクティブが明示的に `off` に設定されている場合は設定されません。デフォルトの、 `AcceptPathInfo` が 指定されていないときの振る舞いでは、`mod_cgi` はパス情報 (URI のスクリプトのファイル名の後に続く `/more/path/info`) を 受け付けますが、コアはサーバはパス情報のあるリクエストに 対して 404 NOT FOUND エラーを返します。`AcceptPathInfo` ディレクティブを 省略すると、`mod_cgi` へのリクエストに対して `On` を 設定したのと同じ効果になります。
REMOTE_HOST
  `HostnameLookups` が `on` (デフォルトでは off です) で、アクセスしているホストのアドレスの DNS の逆引きが実際にホスト名を見つけたときにのみ設定されます。
REMOTE_IDENT
  `IdentityCheck` が `on` に設定されていて、アクセスしているホストが ident プロトコルをサポートしているときにのみ設定されます。 これは簡単に偽ることができ、クライアントとサーバの間に プロキシがあればまったく役に立たないので、 この変数の値は信用できないということに注意してください。
REMOTE_USER
  CGI スクリプトに認証が必要なときにのみ設定されます。

## CGI のデバッグ

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

### CGI ログファイルの書式

設定されているときには、CGI エラーログは適切に動作しないすべての CGI をログ収集します。それぞれの正しく動作しない CGI スクリプトは 複数の行にわたる情報がログ収集されます。最初の 2 行は常に以下の書式です:

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

エラーが、CGI スクリプトが実行できないというものである場合は、 ログファイルはさらにもう 2 行書かれます:

`%%error
error-message`

そうではなく、エラーが正しくないヘッダ情報を返す結果である場合 (スクリプトのバグであることがよくあります)、 以下の情報がログ収集されます:

`%request
受け取ったすべての HTTP リクエストヘッダ
(もしあれば) POST や PUT の中身
%response
CGI スクリプトにより出力されたすべてのヘッダ
%stdout
CGI 標準出力
%stderr
CGI 標準エラー
`

(スクリプトが標準出力や標準エラーに何も出力しなかった場合は、 %stdout や %stderr はありません)。

## ScriptLog ディレクティブ

説明: | CGI スクリプトのエラーログファイルの場所
構文: | `ScriptLog file-path`
コンテキスト: | サーバ設定ファイル, バーチャルホスト
ステータス: | Base
モジュール: | `mod_cgi`, `mod_cgid`

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

### 例

`ScriptLog logs/cgi_log`

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

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

## ScriptLogBuffer ディレクティブ

説明: | スクリプトログに記録される PUT や POST リクエストの内容の上限
構文: | `ScriptLogBuffer bytes`
デフォルト: | `ScriptLogBuffer 1024`
コンテキスト: | サーバ設定ファイル, バーチャルホスト
ステータス: | Base
モジュール: | `mod_cgi`, `mod_cgid`

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

## ScriptLogLength ディレクティブ

説明: | CGI スクリプトのログファイルの大きさの上限
構文: | `ScriptLogLength bytes`
デフォルト: | `ScriptLogLength 10385760`
コンテキスト: | サーバ設定ファイル, バーチャルホスト
ステータス: | Base
モジュール: | `mod_cgi`, `mod_cgid`

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

翻訳済み言語: en | fr | ja | ko

## コメント

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our mailing lists.