1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"><head><!--
4        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5              This file is generated from xml source: DO NOT EDIT
6        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7      -->
8<title>Apache Tutorial: CGI による動的コンテンツ - Apache HTTP サーバ</title>
9<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
10<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
11<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="/style/css/prettify.css" />
12<script src="/style/scripts/prettify.min.js" type="text/javascript">
13</script>
14
15<link href="/images/favicon.ico" rel="shortcut icon" /></head>
16<body id="manual-page"><div id="page-header">
17<p class="menu"><a href="/mod/">モジュール</a> | <a href="/mod/directives.html">ディレクティブ</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="/glossary.html">用語</a> | <a href="/sitemap.html">サイトマップ</a></p>
18<p class="apache">Apache HTTP サーバ バージョン 2.4</p>
19<img alt="" src="/images/feather.gif" /></div>
20<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="/images/left.gif" /></a></div>
21<div id="path">
22<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP サーバ</a> &gt; <a href="http://httpd.apache.org/docs/">ドキュメンテーション</a> &gt; <a href="../">バージョン 2.4</a> &gt; <a href="./">How-To / チュートリアル</a></div><div id="page-content"><div id="preamble"><h1>Apache Tutorial: CGI による動的コンテンツ</h1>
23<div class="toplang">
24<p><span>翻訳済み言語: </span><a href="/en/howto/cgi.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
25<a href="/fr/howto/cgi.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
26<a href="/ja/howto/cgi.html" title="Japanese">&nbsp;ja&nbsp;</a> |
27<a href="/ko/howto/cgi.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
28</div>
29<div class="outofdate">この日本語訳はすでに古くなっている
30            可能性があります。
31            最近更新された内容を見るには英語版をご覧下さい。
32        </div>
33</div>
34<div id="quickview"><ul id="toc"><li><img alt="" src="/images/down.gif" /> <a href="#intro">はじめに</a></li>
35<li><img alt="" src="/images/down.gif" /> <a href="#configuring">CGI を許可するように Apache を設定する</a></li>
36<li><img alt="" src="/images/down.gif" /> <a href="#writing">CGI プログラムを書く</a></li>
37<li><img alt="" src="/images/down.gif" /> <a href="#troubleshoot">しかし、まだ動かない !</a></li>
38<li><img alt="" src="/images/down.gif" /> <a href="#behindscenes">裏で何が起こっているのか?</a></li>
39<li><img alt="" src="/images/down.gif" /> <a href="#libraries">CGI モジュール/ライブラリ</a></li>
40<li><img alt="" src="/images/down.gif" /> <a href="#moreinfo">更なる情報</a></li>
41</ul><ul class="seealso"><li><a href="#comments_section">コメント</a></li></ul></div>
42<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
43<div class="section">
44<h2><a name="intro" id="intro">はじめに</a></h2>
45    
46
47    <table class="related"><tr><th>関連モジュール</th><th>関連ディレクティブ</th></tr><tr><td><ul><li><code class="module"><a href="/mod/mod_alias.html">mod_alias</a></code></li><li><code class="module"><a href="/mod/mod_cgi.html">mod_cgi</a></code></li></ul></td><td><ul><li><code class="directive"><a href="/mod/mod_mime.html#addhandler">AddHandler</a></code></li><li><code class="directive"><a href="/mod/core.html#options">Options</a></code></li><li><code class="directive"><a href="/mod/mod_alias.html#scriptalias">ScriptAlias</a></code></li></ul></td></tr></table>
48
49    <p>CGI (Common Gateway Interface) は、ウェブサーバが
50    コンテンツ生成をする外部プログラムと協調して動作するための方法を
51    定義しています。そのプログラムはしばしば CGI プログラムや
52    CGI スクリプトと呼ばれます。CGI は、ウェブサイトに動的な
53    コンテンツを置くための最も簡単で一般的な方法です。このドキュメントは、
54    Apache ウェブサーバで CGI を設定し、
55    CGI プログラムを書き始めるための入門書となるでしょう。</p>
56  </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
57<div class="section">
58<h2><a name="configuring" id="configuring">CGI を許可するように Apache を設定する</a></h2>
59    
60
61    <p>CGI プログラムを正しく動作させるには、CGI を許可するように
62    Apache の設定を行う必要があります。
63    これを行なうための方法がいくつかあります。</p>
64
65    <div class="warning">
66    注: Apache が共有モジュール機能着きでビルドされている場合、
67    モジュールがロードされていることを確認してください。
68    つまり <code>httpd.conf</code> で 
69    <code class="directive"><a href="/mod/mod_so.html#loadmodule">LoadModule</a></code>
70    がコメントアウトされていないことを確認してください。
71    正常に設定されていれば次のようになるはずです:
72
73    <div class="example"><p><code>
74      LoadModule cgi_module modules/mod_cgi.so
75    </code></p></div></div>
76
77    <h3><a name="scriptalias" id="scriptalias">ScriptAlias</a></h3>
78      
79
80      <p><code class="directive"><a href="/mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
81      ディレクティブを使用して、
82      CGI プログラム用の特別な別ディレクトリを Apache に設定します。
83      Apache は、このディレクトリ中の全てのファイルを CGI
84      プログラムであると仮定します。
85      そして、この特別なリソースがクライアントから要求されると、
86      そのプログラムの実行を試みます。</p>
87
88      <p><code class="directive"><a href="/mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
89      ディレクティブは以下のように使用します:</p>
90
91      <div class="example"><p><code>
92        ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
93      </code></p></div>
94
95      <p>デフォルト位置に Apache をインストールしたならば、
96      この例はデフォルト状態の <code>httpd.conf</code>
97      設定ファイルに含まれています。
98      <code class="directive"><a href="/mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
99      ディレクティブは、URL の前に付加するディレクトリを定義する
100      <code class="directive"><a href="/mod/mod_alias.html#alias">Alias</a></code>
101      ディレクティブとかなり似ています。
102      <code class="directive">Alias</code> と <code class="directive">ScriptAlias</code>
103      は通常、<code class="directive"><a href="/mod/core.html#documentroot">DocumentRoot</a></code>
104      ディレクトリ外のディレクトリのために使用されます。
105      <code class="directive">Alias</code> と <code class="directive">ScriptAlias</code>
106      との差は、<code class="directive">ScriptAlias</code> が接頭辞で始まるすべての
107      URL は CGI プログラムとみなされるという追加の意味を含んでいることです。
108      従って、上記の例では、<code>/cgi-bin/</code>
109      で始まるリソースへのあらゆるリクエストに対して、ディレクトリ
110      <code>/usr/local/apache2/cgi-bin/</code> から提供し、それらを
111      CGI プログラムとして扱うよう Apache に示します。</p>
112
113      <p>例えば、URL <code>http://www.example.com/cgi-bin/test.pl</code>
114      が要求された場合、Apache は ファイル
115      <code>/usr/local/apache2/cgi-bin/test.pl</code>
116      を実行し、その出力を返すことを試みます。
117      もちろん、ファイルが存在し、実行可能であり、決められた方法で出力を返します。
118      そうでなければ、Apache はエラーメッセージを返します。</p>
119    
120
121    <h3><a name="nonscriptalias" id="nonscriptalias">ScriptAlias ディレクトリ外の CGI</a></h3>
122      
123
124      <p>CGI プログラムは、セキュリティ上の理由から 
125      <code class="directive"><a href="/mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
126      されたディレクトリに制限されることがしばしばあります。この方法により、
127      CGI プログラムを使用できるユーザを管理者が厳しく制御することができます。
128      しかしながら、適切なセキュリティ事前対策がとられるならば、CGI
129      プログラムを任意のディレクトリで実行できないようにする理由はありません。
130      例えば、ユーザに <code class="directive"><a href="/mod/mod_userdir.html#userdir">UserDir</a></code>
131      ディレクティブで彼らのホームディレクトリ配下にウェブコンテンツを持たせたいとします。
132      もし、彼らが CGI プログラムを持つことを望んでいても、メインの
133      <code>cgi-bin</code> ディレクトリへのアクセスができない場合、
134      CGI プログラムを実行することができる他の場所が必要になります。</p>
135
136      <p>任意のディレクトリで CGI の実行を許可するには二段階の設定が必要です。
137      まず、<code class="directive"><a href="/mod/mod_mime.html#addhandler">AddHandler</a></code> や <code class="directive"><a href="/mod/core.html#sethandler">SetHandler</a></code> ディレクティブによって
138      <code>cgi-script</code> ハンドラが可能になっている必要があります。
139      次に、<code class="directive"><a href="/mod/core.html#options">Options</a></code> ディレクティブで
140      <code>ExecCGI</code> が指定されていなければなりません。</p>
141    
142
143    <h3><a name="options" id="options">CGI の実行を可能にするために Options を明示的に使用する</a></h3>
144      
145
146      <p>サーバのメインの設定ファイル中で <code class="directive"><a href="/mod/core.html#options">Options</a></code>
147      ディレクティブを明示的に使用することで、特定のディレクトリ配下で
148      CGI の実行を許可するように指定することができます:</p>
149
150      <div class="example"><p><code>
151        &lt;Directory /usr/local/apache2/htdocs/somedir&gt;<br />
152        <span class="indent">
153          Options +ExecCGI<br />
154        </span>
155        &lt;/Directory&gt;
156      </code></p></div>
157
158      <p>上記ディレクティブは、CGI ファイルの実行を可能にするよう
159      Apache に伝えます。また、どのファイルが CGI ファイルかを
160      サーバに伝える必要があります。次の
161      <code class="directive"><a href="/mod/mod_mime.html#addhandler">AddHandler</a></code>
162      ディレクティブの例では、<code>cgi</code> または <code>pl</code>
163      を拡張子に持つすべてのファイルを CGI
164      プログラムとしてみなすことをサーバに伝えます:</p>
165
166      <div class="example"><p><code>
167        AddHandler cgi-script .cgi .pl
168      </code></p></div>
169    
170
171    <h3><a name="htaccess" id="htaccess">.htaccess ファイル</a></h3>
172      
173
174      <p><a href="htaccess.html"><code>.htaccess</code> チュートリアル</a>
175      は <code>httpd.conf</code> を変更できない場合にどうやって CGI プログラムを
176      使えるようにするかを説明しています。</p>
177    
178
179    <h3><a name="userdir" id="userdir">User ディレクトリ</a></h3>
180      
181
182      <p><code>.cgi</code> で終わるすべてのファイルに対して CGI プログラムの
183      実行を許可するには、以下の設定を使用できます。</p>
184
185      <div class="example"><p><code>
186      &lt;Directory /home/*/public_html&gt;<br />
187      <span class="indent">
188        Options +ExecCGI<br />
189        AddHandler cgi-script .cgi<br />
190      </span>
191      &lt;/Directory&gt;
192      </code></p></div>
193
194      <p>ユーザディレクトリの <code>cgi-bin</code> サブディレクトリの
195      すべてのファイルを CGI プログラムとして指定したい場合には
196      以下のようなものを使います。</p>
197
198      <div class="example"><p><code>
199      &lt;Directory /home/*/public_html/cgi-bin&gt;<br />
200      <span class="indent">
201        Options ExecCGI<br />
202        SetHandler cgi-script<br />
203      </span>
204      &lt;/Directory&gt;
205      </code></p></div>
206
207    
208  </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
209<div class="section">
210<h2><a name="writing" id="writing">CGI プログラムを書く</a></h2>
211    
212
213    <p>「通常の」プログラミングと CGI
214    プログラミングの間には主に二つの違いがあります。</p>
215
216    <p>一つは、CGI プログラムのすべての出力には<a class="glossarylink" href="/glossary.html#mime-type" title="用語集を参照">MIME タイプ</a>
217    ヘッダを付けなければなりません。
218    これはどのような種類のコンテンツを受け取っているかをクライアントに示す
219    HTTP ヘッダです。ほとんどの場合では、次のように出力します:</p>
220
221    <div class="example"><p><code>
222      Content-type: text/html
223    </code></p></div>
224
225    <p>もう一つは、出力を HTML
226    か、ブラウザが表示することができる何か他の形式にする必要があります。
227    大抵の場合は HTML でしょうが、GIF イメージや他の非 HTML
228    コンテンツを出力する CGI プログラムを書くこともあるでしょう。</p>
229
230    <p>これら二点以外では、CGI プログラムを書くことは、
231    あなたが書いている他のプログラムとよく似ているでしょう。</p>
232
233    <h3><a name="firstcgi" id="firstcgi">最初の CGI プログラム</a></h3>
234      
235
236      <p>次に示すのは、ブラウザに 1 行印字する CGI
237      プログラムの例です。以下を入力し、<code>first.pl</code>
238      というファイルに保存し、それを <code>cgi-bin</code>
239      ディレクトリに置いてください。</p>
240
241      <div class="example"><p><code>
242        #!/usr/bin/perl<br />
243        print "Content-type: text/html\n\n";<br />
244        print "Hello, World.";
245      </code></p></div>
246
247      <p>Perl に精通していなくても、
248      何が起こるかを理解することはできるでしょう。1 行目は、
249      <code>/usr/bin/perl</code> で見つけられるインタプリタに
250      このファイルを供給することでこのプログラムが実行されることを
251      Apache に (シェル上で実行しようとしているならば、そのシェルに ) 
252      示します。2 行目は、前述したとおり content-type の定義を印字します。
253      これには復帰改行の二つの組を後に付加します。
254      これにより、ヘッダの終りに空行が置かれ、HTTP
255      ヘッダの終りとボディの始まりを示します。3 行目は、"Hello, World."
256      という文字列を印字し、これで終りとなります。</p>
257
258      <p>好みのブラウザを開き、アドレス</p>
259
260      <div class="example"><p><code>
261        http://www.example.com/cgi-bin/first.pl
262      </code></p></div>
263
264      <p>あるいはファイルを置いたロケーションを指定すると、
265      <code>Hello, World.</code>
266      という 1 行がブラウザウィンドに現れるでしょう。
267      それはあまりエキサイティングなことではありません。
268      しかし、これがうまく動けば、
269      他のどのようなものでも動かすことができるようになります。</p>
270    
271  </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
272<div class="section">
273<h2><a name="troubleshoot" id="troubleshoot">しかし、まだ動かない !</a></h2>
274    
275
276    <p>ウェブから CGI プログラムへのアクセスを行なったとき、
277    ブラウザで見る可能性がある四つの基本的なことがあります:</p>
278
279    <dl>
280      <dt>CGI プログラムの出力</dt>
281      <dd>素晴らしい ! それはすべてがうまく動いたことを意味します。
282      出力が正常だけれども、ブラウザが正常に処理してくれない場合は、
283      正しい <code>Content-Type</code> を CGI プログラム内で
284      セットしたかを確認してください。</dd>
285
286      <dt>CGI プログラムのソースコード、または "POST Method Not Allowed"
287      というメッセージ</dt> 
288      <dd>これは、CGI プログラムを処理できるよう Apache
289      を適切に設定していなかったことを意味します。<a href="#configuring">「CGI を許可するように
290      Apache を設定する」</a>の章を読み直し、
291      あなたが何を間違えたかを探してみてください。
292      </dd>
293
294      <dt>メッセージが "Forbidden" で始まっている</dt>
295      <dd>これはパーミッションの問題ということを意味します。
296      <a href="#errorlogs">Apache のエラーログ</a>と、後述の<a href="#permissions">「ファイルのパーミッション」</a>
297      の章をチェックしてください。
298      </dd>
299
300      <dt>"Internal Server Error" というメッセージ</dt>
301      <dd><a href="#errorlogs">Apache
302      のエラーログ</a>をチェックすると、"Premature end of script headers"
303      というログが記録されていると思います。そして、おそらく CGI
304      プログラムによって生成されたエラーメッセージも記録されているでしょう。
305      この場合、CGI プログラムが適切な
306      HTTP ヘッダを出力できない原因を知るために、
307      以下の各章でチェックしてみてください。</dd>
308    </dl>
309
310    <h3><a name="permissions" id="permissions">ファイルのパーミッション</a></h3>
311      
312
313      <p>サーバはあなたの権限で実行されていないのを忘れないように。
314      つまり、起動するとき、サーバは特権をもたないユーザ - 通常 <code>nobody</code>
315      や <code>www</code> の権限で実行されます。したがって、あなたが所有する
316      ファイルを実行するには別のパーミッションが必要となります。
317      通常、<code>nobody</code> が実行するのに十分なパーミッションを与える方法は、
318      ファイルに誰でも実行可能とするパーミッションを与えることです:</p>
319
320      <div class="example"><p><code>
321        chmod a+x first.pl
322      </code></p></div>
323
324      <p>また、もしあなたのプログラムが他のファイルを読み書きするならば、
325      それらのファイルは、これが可能となる正しいパーミッション
326      を持っている必要があります。</p>
327
328    
329
330    <h3><a name="pathinformation" id="pathinformation">パス情報と環境</a></h3>
331      
332
333      <p>コマンドラインからプログラムを実行するとき、
334      意識しなくてもシェルに渡される情報があります。
335      例えば、参照するファイルのためにどこを検索したらよいかを
336      シェルに伝える <code>PATH</code> があります。</p>
337
338      <p>プログラムが CGI プログラムとしてウェブサーバによって実行されるとき、
339      それは同じ <code>PATH</code> ではないかもしれません。
340      CGI プログラム内で呼び出すあらゆるプログラム
341      (例えば、<code>sendmail</code> のようなもの) は、
342      フルパスで指定する必要があるでしょう。それにより、CGI
343      プログラムを実行しようとしたとき、
344      シェルはそのようなプログラムを見つけることができます。</p>
345
346      <p>同様なことは、スクリプトのインタプリタ (しばしば <code>perl</code>)
347      へのパスで、CGI プログラムの 1 行目に次のように示されます:</p>
348
349      <div class="example"><p><code>
350        #!/usr/bin/perl
351      </code></p></div>
352
353      <p>これがインタープリタへの実際のパスであることを確認しておきます。</p>
354    
355
356      <p>また、CGI プログラムが他の<a href="#env">環境変数</a>に依存している場合は、その環境変数が
357      Apache から渡されるようにする必要があります。</p>
358
359    <h3><a name="syntaxerrors" id="syntaxerrors">プログラムエラー</a></h3>
360      
361
362      <p>CGI
363      プログラムが失敗するのは大抵、プログラム自身に問題がある場合です。
364      一度 CGI の使い方を理解し、前述の二つの誤りを犯していないならば、
365      まず間違いなくそうでしょう。ブラウザを使ってテストする前に
366      まず確認することは、コマンドラインからプログラムが実行できることです。
367      例えば、以下を実行してみてください:</p>
368
369      <div class="example"><p><code>
370      cd /usr/local/apache2/cgi-bin<br />
371      /first.pl
372      </code></p></div>
373
374      <p>(<code>perl</code> インタプリタは呼ばないでください。
375      シェルと Apache がスクリプトの最初の行の <a href="#pathinformation">パス情報</a> を使って見つけます。)</p>
376
377      <p>最初にプログラムから出力されるのは <code>Content-Type</code> を含み、
378      後に空行の続く HTTP ヘッダでなければなりません。他のものが出力されている
379      場合は、Apache はこのプログラムをサーバ経由で実行しようとしたときには
380      <code>Premature end of script headers</code> エラーを出力します。詳細は
381      上記の <a href="#writing">CGI プログラムを書く</a> を読んでください。</p>
382    
383
384    <h3><a name="errorlogs" id="errorlogs">エラーログ</a></h3>
385      
386
387      <p>エラーログは友達です。
388      全てのうまくいかないことは、エラーログにメッセージを生成します。
389      必ずそれを最初に見るべきです。
390      もし、あなたがウェブサイトを主催している場所が
391      エラーログの参照を許していないならば、きっと他のサイトで主催するべきです。
392      エラーログの読み方を学ぶことで、ほとんど全ての問題が迅速に確認され、
393      迅速に解決されるということが分かるでしょう。</p>
394    
395
396    <h3><a name="suexec" id="suexec">Suexec</a></h3>
397      
398
399      <p><a href="/suexec.html">suexec</a> サポートプログラムは
400      バーチャルホストやユーザのホームディレクトリの場所に依って
401      CGI プログラムを違うユーザ権限の下で走らせることを可能にします。
402      Suexec の権限のチェックは非常に厳しく、それを満たさない場合は
403      CGI プログラムが <code>Premature end of script headers</code> エラーで
404      実行されません。</p>
405
406      <p>suexec を使っているかどうかを調べためには <code>apachectl
407      -V</code> を実行して、<code>SUEXEC_BIN</code> の場所を調べてください。
408      Apache がそこに <code class="program"><a href="/programs/suexec.html">suexec</a></code> のバイナリを発見した場合は、suexec が
409      使用されます。</p>
410
411      <p>suexec を完全に理解していない限り、使うべきではありません。
412      suexec を無効にするには、<code>SUEXEC_BIN</code> から指されている
413      <code class="program"><a href="/programs/suexec.html">suexec</a></code> バイナリを削除 (か名前を変更) するだけです。
414      <a href="/suexec.html">suexec</a> を読んだ後で、まだそれを
415      使いたいのであれば、<code>suexec -V</code> を実行して suexec の
416      ログファイルの位置を調べ、そのログファイルを使ってポリシー違反を
417      見つけてください。</p>
418    
419  </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
420<div class="section">
421<h2><a name="behindscenes" id="behindscenes">裏で何が起こっているのか?</a></h2>
422    
423
424    <p>CGI プログラミングに習熟すると、
425    裏で起こっていることについて更に理解することの役に立ちます。
426    ブラウザとサーバがどのように相互通信するかについては特にそうです。
427    なぜなら、"Hello, World."
428    を印字するプログラムを書くことはおおいに結構ですが、
429    それは特に有益ではありません。</p>
430
431    <h3><a name="env" id="env">環境変数</a></h3>
432      
433
434      <p>環境変数は、
435      あなたがコンピュータを使うときに辺りに存在している値です。
436      それらは、パス
437      (コマンドをタイプしたときに実行する実際のファイルを探し出すところ)、
438      ユーザ名、端末型などのような便利なものです。
439      通常、普段使用している環境変数の完全なリストを調べるには、
440      コマンドプロンプトで <code>env</code> を入力します。</p>
441
442      <p>CGI の処理中、サーバとブラウザも環境変数を設定し、
443      それにより相互に通信することができるようになります。
444      その環境変数は、ブラウザタイプ (Netscape, IE, Lynx)、サーバタイプ
445      (Apache, IIS, WebSite)、実行されている CGI
446      プログラムの名前などです。</p>
447
448      <p>これらの変数は CGI プログラマが使用できます。
449      そして、それはクライアントとサーバの通信の話の半分です。
450      必要な変数の完全なリストは <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a> にあります。</p>
451
452      <p>以下の単純な Perl CGI
453      プログラムは、渡される全ての環境変数を表示します。同様のプログラムは、
454      Apache ディストリビューションの <code>cgi-bin</code>
455      ディレクトリに二つ含まれています。
456      いくつかの変数が必須であり、いくつかは任意であることに注意してください。
457      そして、公式のリストにはないいくつかの変数が表示されているかもしれません。
458      さらに、Apache はデフォルトで用意されている基本的なものに
459      <a href="/env.html">あなた自身の環境変数を加える</a>ための、
460      多くの異なる方法を用意してします。</p>
461
462      <div class="example"><p><code>
463        #!/usr/bin/perl<br />
464        print "Content-type: text/html\n\n";<br />
465        foreach $key (keys %ENV) {<br />
466        <span class="indent">
467          print "$key --&gt; $ENV{$key}&lt;br&gt;";<br />
468        </span>
469        }
470      </code></p></div>
471    
472
473    <h3><a name="stdin" id="stdin">STDIN と STDOUT</a></h3>
474      
475
476      <p>サーバとクライアント間のもう一つの通信は、標準入力
477      (<code>STDIN</code>)と標準出力 (<code>STDOUT</code>)
478      を通じて行なわれます。通常の文脈において、<code>STDIN</code>
479      はキーボードやプログラムが動作するために与えられるファイルを意味し、
480      <code>STDOUT</code> は通常コンソールまたはスクリーンを意味します。</p>
481
482      <p>ウェブフォームから CGI プログラムへ<code>POST</code>
483      したとき、フォームのデータは特別なフォーマットで束ねられ、
484      <code>STDIN</code> を通して、CGI プログラムに引き渡されます。
485      プログラムはデータがキーボード
486      もしくはファイルから来ていたかのように処理することができます。</p>
487
488      <p>「特別なフォーマット」はとても単純です。フィールド名と値はイコール
489      (=) で結ばれます。そして値の組はアンパサンド (&amp;) で結ばれます。
490      スペース、アンパサンド、イコールのような面倒な文字は、
491      それらが動作を駄目にしないようにその文字に相当する 16 進に変換されます。
492      全データ文字列は、以下のようになります:
493      </p>
494
495      <div class="example"><p><code>
496        name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
497      </code></p></div>
498
499      <p>時々、このような文字列が URL
500      に付加されるのを見るでしょう。その場合、サーバは
501      <code>QUERY_STRING</code> という環境変数にその文字列を入れます。それは
502      <code>GET</code> リクエストと呼ばれます。
503      HTML フォームでは、データを渡すために <code>GET</code> と
504      <code>POST</code> のどちらを使用するかを、<code>FORM</code> タグの
505      <code>METHOD</code> 属性の設定で指定します。</p>
506
507      <p>CGI プログラムは、その文字列を役に立つ情報に分割する責任があります。
508      幸いにも、そのデータ処理を助けるライブラリやモジュールが存在します。
509      これらは、CGI プログラムの他の面でも同様に役に立ちます。</p>
510    
511  </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
512<div class="section">
513<h2><a name="libraries" id="libraries">CGI モジュール/ライブラリ</a></h2>
514    
515
516    <p>CGI プログラムを書くとき、面倒な仕事の大部分をしてくれる
517    コードライブラリまたはモジュールを使うことを検討すべきです。
518    これはエラーを減らし、早い開発につながります。</p>
519
520    <p>Perl で CGI プログラムを書いているなら、モジュールは <a href="http://www.cpan.org/">CPAN</a> で提供されています。
521    この目的のための最も普及しているモジュールは <code>CGI.pm</code> です。
522    <code>CGI::Lite</code> も検討しましょう。これは、ほとんどのプログラム
523    において必要とするすべての機能の最小セットの実装です。</p>
524
525    <p>C で CGI プログラムを書いているなら、いろいろな
526    オプションがあります。これらの内の一つは <a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>
527    で提供されている <code>CGIC</code> ライブラリです。</p>
528  </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
529<div class="section">
530<h2><a name="moreinfo" id="moreinfo">更なる情報</a></h2>
531    
532
533    <p>CGI に関する情報はウェブで数多く提供されています。CGI
534    の問題については Usenet の <a href="news:comp.infosystems.www.authoring.cgi">comp.infosystems.www.authoring.cgi</a> で、
535    他のユーザと論議することができます。HTML Writers Guide の
536    -servers メーリングリストは、あなたの質問に回答してくれる偉大なリソースです。
537    <a href="http://www.hwg.org/lists/hwg-servers/">http://www.hwg.org/lists/hwg-servers/</a>
538    で更に多くを探し出すことができます。</p>
539
540    <p>そしてもちろん、おそらく CGI
541    プログラムの動作に関する詳細の全てが記述されている
542    CGI の仕様を読むべきです。オリジナルバージョンを
543    <a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">NCSA</a>
544    で、アップデートされたドラフトを
545    <a href="http://web.golux.com/coar/cgi/">Common Gateway Interface RFC
546    プロジェクト</a>で参照することができます。</p>
547
548    <p>CGI の問題について、加わっているメーリングリストまたはニュース
549    グループに質問を送るとき、起こったもの、起こってほしいこと、
550    実際に起こったことがどう違うか、使用しているサーバ、
551    CGI プログラムを記述している言語に関する十分な情報と、
552    可能であれば問題のコードを提供するようにしてください。
553    そうすることで、問題がより間単に見つかるようになります。</p>
554
555    <p>Apache のソースコードにおいて問題を発見したことを確信していない限り、
556    CGI の問題に関する質問を Apache
557    バグデータベースに<strong>送るべきでない</strong>
558    ことに注目してください。</p>
559  </div></div>
560<div class="bottomlang">
561<p><span>翻訳済み言語: </span><a href="/en/howto/cgi.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
562<a href="/fr/howto/cgi.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
563<a href="/ja/howto/cgi.html" title="Japanese">&nbsp;ja&nbsp;</a> |
564<a href="/ko/howto/cgi.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
565</div><div class="top"><a href="#page-header"><img src="/images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">コメント</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;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 <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
566<script type="text/javascript"><!--//--><![CDATA[//><!--
567var comments_shortname = 'httpd';
568var comments_identifier = 'http://httpd.apache.org/docs/2.4/howto/cgi.html';
569(function(w, d) {
570    if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
571        d.write('<div id="comments_thread"><\/div>');
572        var s = d.createElement('script');
573        s.type = 'text/javascript';
574        s.async = true;
575        s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
576        (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
577    }
578    else { 
579        d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
580    }
581})(window, document);
582//--><!]]></script></div><div id="footer">
583<p class="apache">Copyright 2014 The Apache Software Foundation.<br />この文書は <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> のライセンスで提供されています。.</p>
584<p class="menu"><a href="/mod/">モジュール</a> | <a href="/mod/directives.html">ディレクティブ</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="/glossary.html">用語</a> | <a href="/sitemap.html">サイトマップ</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
585if (typeof(prettyPrint) !== 'undefined') {
586    prettyPrint();
587}
588//--><!]]></script>
589</body></html>