github.com/krum110487/go-htaccess@v0.0.0-20240316004156-60641c8e7598/tests/data/apache_2_2_34/manual/howto/cgi.html.ja.utf8 (about)

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