<?xml version="1.0" encoding="iso-2022-jp"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
  <head>


    <title>Apache の環境変数</title>
  </head>
  <!-- English revision: 1.18 -->
  <!-- Background white, links blue (unvisited), navy (visited), red (active) -->
  <body bgcolor="#ffffff" text="#000000" link="#0000ff"
  vlink="#000080" alink="#ff0000">
        <div align="CENTER">
      <img src="images/sub.gif" alt="[APACHE DOCUMENTATION]" /> 

      <h3>Apache HTTP Server</h3>
    </div>



    <h1 align="center">Apache における環境変数</h1>

    <p>Apache HTTP サーバは<em>環境変数</em>と呼ばれる、名前のついた
    変数に情報を記憶する仕組みを提供しています。この情報はログ収集や
    アクセス制御などのいろいろな操作を制御するために使うことができます。
    これらの変数は CGI スクリプトなどの外部プログラムと通信するためにも
    使われます。この文書はそれらの変数の操作方法と使用方法をいくつか
    紹介します。</p>


    <p>これらの変数は<em>環境変数</em>と呼ばれていますが、オペレーティング
    システムによって制御されている環境変数と同じではありません。
    実際は、これらの変数は Apache の内部構造の中に記憶され、操作されています。
    それらは、CGI や SSI スクリプトに渡されたときだけ、実際の
    オペレーティングシステムの環境変数になります。サーバ自身が
    実行されているオペレーティングシステムの環境を操作したい場合は、
    オペレーティングシステムのシェルが提供している標準の環境変数の
    操作方法を使わなければなりません。</p>

    <ul>
      <li><a href="#setting">環境変数の設定</a></li>

      <li><a href="#using">環境変数の使用</a></li>

      <li><a href="#special">特別な目的の環境変数</a></li>

      <li><a href="#examples">例</a></li>
    </ul>
    <hr />

    <h2><a id="setting" name="setting">環境変数の設定</a></h2>


    <table border="1">
      <tr>
        <td valign="top"><strong>関連モジュール</strong><br />
         <br />
         <a href="mod/mod_env.html">mod_env</a><br />
         <a href="mod/mod_rewrite.html">mod_rewrite</a><br />
         <a href="mod/mod_setenvif.html">mod_setenvif</a><br />
         <a href="mod/mod_unique_id.html">mod_unique_id</a><br />
         </td>

        <td valign="top"><strong>関連ディレクティブ</strong><br />
         <br />
         <a
        href="mod/mod_setenvif.html#BrowserMatch">BrowserMatch</a><br />
         <a
        href="mod/mod_setenvif.html#BrowserMatchNoCase">BrowserMatchNoCase</a><br />
         <a href="mod/mod_env.html#passenv">PassEnv</a><br />
         <a
        href="mod/mod_rewrite.html#RewriteRule">RewriteRule</a><br />
         <a href="mod/mod_env.html#setenv">SetEnv</a><br />
         <a
        href="mod/mod_setenvif.html#SetEnvIf">SetEnvIf</a><br />
         <a
        href="mod/mod_setenvif.html#SetEnvIfNoCase">SetEnvIfNoCase</a><br />
         <a href="mod/mod_env.html#unsetenv">UnsetEnv</a><br />
         </td>
      </tr>
    </table>

    <h3>基本的な環境の操作</h3>

    <p>Apache において環境変数を設定する一番基本的な方法は、
    無条件に環境変数を設定する <code>SetEnv</code>
    ディレクティブを使用することです。 <code>PassEnv</code> 
    ディレクティブにより、Apache が起動されたシェルの
    環境変数を渡すこともできます。</p>

    <h3>リクエスト毎に条件に基づいて設定する</h3>

    <p>より柔軟性を高めるために、mod_setenvif
    で提供されているディレクティブを使用することで、リクエストの
    特性に基づいて環境変数を設定することができます。例えば、特定のブラウザ
    (User-Agent) のリクエストや特定の Referer [意図的な綴りです]
    (訳注: 正しい綴りは referrer ですが、HTTP の仕様では Referer
    となっています) ヘッダが見つかったときのみ変数を設定することができます。
    mod_rewrite の <code>RewriteRule</code> ディレクティブにおいて
    環境変数を設定する <code>[E=...]</code> オプションを使用することで、
    より柔軟な設定を行なうことができます。</p>

    <h3>一意な識別子</h3>

    <p>mod_unique_id は、非常に限られた条件の下で
    「すべて」のリクエストについて、一意であることが保証されている値を環境変数
    <code>UNIQUE_ID</code> に設定します。
    </p>

    <h3>標準 CGI 変数</h3>

    <p>Apache の設定ファイルで設定された環境変数とシェルから渡される
    環境変数に加えて、CGI スクリプトと SSI ページには <a
    href="misc/FAQ.html#cgi-spec">CGI の仕様</a>で要求されている、
    リクエストのメタ情報を持った環境変数の組が提供されます。
    </p>

    <h3>いくつかの注意</h3>

    <ul>
      <li>環境を操作するディレクティブを使って標準 CGI
      変数を上書きしたり変更したりすることはできません。</li>

      <li>CGI スクリプトを起動するために <a href="suexec.html">suexec</a>
      が使用されている場合、CGI スクリプトが起動するために、環境変数は<em
      >安全</em>な環境変数の組に整理されます。
      この安全な環境変数の集合は、コンパイル時に <code>suexec.c</code>
      で定義されます。</li>

      <li>移植性のために、環境変数の名前はアルファベット、
      数字とアンダースコア (訳注: '_') だけから成ります。
      さらに、最初の文字は数字であってはいけません。
      この制限に合わない文字は CGI スクリプトと SSI
      ページに渡されるときにアンダースコアに置換されます。
      </li>
    </ul>
    <hr />

    <h2><a id="using" name="using">環境変数の使用</a></h2>


    <table border="1">
      <tr>
        <td valign="top"><strong>関連モジュール</strong><br />
         <br />
         <a href="mod/mod_access.html">mod_access</a><br />
         <a href="mod/mod_cgi.html">mod_cgi</a><br />
         <a href="mod/mod_include.html">mod_include</a><br />
         <a href="mod/mod_log_config.html">mod_log_config</a><br />
         <a href="mod/mod_rewrite.html">mod_rewrite</a><br />
         </td>

        <td valign="top"><strong>関連ディレクティブ</strong><br />
         <br />
         <a href="mod/mod_access.html#allow">Allow</a><br />
         <a
        href="mod/mod_log_config.html#customlog">CustomLog</a><br />
         <a href="mod/mod_access.html#deny">Deny</a><br />
         <a
        href="mod/mod_log_config.html#logformat">LogFormat</a><br />
         <a
        href="mod/mod_rewrite.html#RewriteCond">RewriteCond</a><br />
         <a
        href="mod/mod_rewrite.html#RewriteRule">RewriteRule</a><br />
         </td>
       </tr>
    </table>

    <h3>CGI スクリプト</h3>

    <p>環境変数の主な利用法の一つは、CGI スクリプトに情報を伝えることです。
    上で説明されているように、CGI スクリプトに渡される環境変数は Apache
    の設定により設定される変数に加えて、リクエストの標準のメタ情報を含んでいます。
    詳細は <a href="howto/cgi.html">CGI チュートリアル</a> を参照してください。
    </p>


    <h3>SSI ページ</h3>

    <p>
    mod_include の <code>server-parsed</code> ハンドラで処理される
    server-parsed (SSI) ドキュメントでは、<code>echo</code>
    要素を使用すると環境変数が出力されます。
    また、ページのある部分がリクエストの性質に応じて変更されるように、
    環境変数をフロー制御要素で使うことができます。詳細は
    <a href="howto/ssi.html">SSI チュートリアル</a> を参照してください。
    </p>

    <h3>アクセス制御</h3>

    <p><code>allow from env=</code> ディレクティブと <code>deny from env=</code>
    ディレクティブを使用して、サーバへのアクセスを環境変数の値で制御することができます。
    <code>SetEnvIf</code> ディレクティブと組み合わせることで、クライアントの特性に基づいて
    サーバへのアクセス制御を柔軟に行なうことができるようになります。
    例えば、これらのディレクティブを使用して、特定のブラウザ (User-Agent)
    からのアクセスを拒否することができます。
    </p>

    <h3>条件付きログ記録</h3>

    <p>
    <code>LogFormat</code> ディレクティブのオプション <code>%e</code>
    を使用することで、環境変数をアクセスログに記録することができます。さらに、
    <code>CustomLog</code> ディレクティブの条件分岐式を使用することで、
    環境変数の値によってリクエストをログに記録するかどうかを決めることができます。
    <code>SetEnvIf</code> ディレクティブと組み合わせることで、
    どのリクエストをログに記録するかを柔軟に制御することが可能になります。例えば、
    <code>gif</code> で終わるファイル名へのリクエストはログに記録しない、
    違うサブネットのクライアントからのリクエストだけをログに記録する、という選択が可能です。
    </p>

    <h3>URL の書き換え</h3>

    <p><code>RewriteCond</code> ディレクティブで<em>評価文字列</em>として
    <code>%{ENV:...}</code> 式を指定することで、mod_rewrite
    の書き換えエンジンが環境変数に基いて条件分岐を行なうことができます。
    mod_rewrite が使用可能な変数で <code>ENV:</code> が前についていない変数は、
    実際は環境変数ではないということに注意してください。
    それらは他のモジュールからは使用できない mod_rewrite 用の特別な変数です。
    </p>
    <hr />

    <h2><a id="special" name="special">特別な目的の環境変数</a></h2>


    <p>
    互換性の問題を解決するために、特定のクライアントと通信しているときは
    Apache の動作を変更できる機構が導入されました。できるだけ柔軟にするために、
    これらの機構は環境変数を定義することで呼び出されます。普通は、
    <a href="mod/mod_setenvif.html#browsermatch">BrowserMatch</a>
    ディレクティブを使いますが、例えば <a href="mod/mod_env.html#setenv"
    >SetEnv</a> ディレクティブや <a href="mod/mod_env.html#passenv"
    >PassEnv</a> ディレクティブも使用することができます。
    </p>

    <h2>downgrade-1.0</h2>

    <p>これを指定することで、リクエストが HTTP/1.0
    より新しいプロトコルの場合でも、HTTP/1.0 として扱われます。</p>

    <h2>force-no-vary</h2>

    <p>応答ヘッダがクライアントに送られる前に <code>Vary</code>
    フィールドを取り除きます。
    クライアントの中にはこのフィールドを正しく解釈しないものがあります
    (<a href="misc/known_client_problems.html">クライアントの既知の問題</a>
    のページを参照してください)。この変数を設定することでその問題を回避
    することができます。この変数を設定すると、<strong>force-response-1.0</strong>
    が設定されたことになります。</p>

    <h2>force-response-1.0</h2>

    <p>これが設定されていると、常に HTTP/1.0 での応答になります。この機能は、
    元々は AOL のプロキシの問題のために実装されました。クライアントの中には、
    HTTP/1.1 の応答を返されると正しく動作しないものがあるかもしれません。
    この機能を使用することで、そのようなクライアントとの間の互換性問題を解決できます。</p>

    <h2>nokeepalive</h2>

    <p>これが設定されている場合は、<a href="mod/core.html#keepalive"
    >KeepAlive</a> を使用しないようにします。</p>
    <hr />

    <h2><a id="examples" name="examples">例</a></h2>

    <h3>おかしな挙動をするクライアントに対してプロトコルの動作を変更する</h3>

    <p>クライアントに関する既知の問題に対処するために、以下の行を
    httpd.conf に入れることを推奨しています。</p>
<pre>
#
# The following directives modify normal HTTP response behavior.
# The first directive disables keepalive for Netscape 2.x and browsers that
# spoof it. There are known problems with these browser implementations.
# The second directive is for Microsoft Internet Explorer 4.0b2
# which has a broken HTTP/1.1 implementation and does not properly
# support keepalive when it is used on 301 or 302 (redirect) responses.
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

#
# The following directive disables HTTP/1.1 responses to browsers which
# are in violation of the HTTP/1.0 spec by not being able to grok a
# basic 1.1 response.
#
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
</pre>

    <h3>画像へのリクエストをアクセスログに記録しない</h3>

    <p>この例では、画像へのリクエストがアクセスログに現れないようにします。
    これを変更することで、特定のディレクトリのログ収集をやめたり、
    特定のホストからのリクエストのログ収集をやめたりすることが簡単にできます。
    </p>
<pre>
    SetEnvIf Request_URI \.gif image-request
    SetEnvIf Request_URI \.jpg image-request
    SetEnvIf Request_URI \.png image-request
    CustomLog logs/access_log env=!image-request
</pre>

    <h3>「画像の盗用」を防ぐ</h3>

    <p>この例は、別のサーバにいる人が、あなたのサーバにある画像を
    inline 画像として使用することを防ぎます。
    これは推奨されている設定ではありませんが、ある限定された状況では有効です。
    ここでは、すべての画像は /web/images というディレクトリにあると仮定します。
    </p>
<pre>
    SetEnvIf Referer "^http://www.example.com/" local_referal
    # Allow browsers that do not send Referer info
    SetEnvIf Referer "^$" local_referal
    &lt;Directory /web/images&gt;
       Order Deny,Allow
       Deny from all
       Allow from env=local_referal
    &lt;/Directory&gt;
</pre>

    <p><em>注:</em> 'referer' と 'referal' の綴りは意図的なものです (訳注:
    正しい綴りは referrer と referral)。</p>

    <p>この手法に関する詳しい情報は ApacheToday のチュートリアル &quot;<a
    href="http://apachetoday.com/news_story.php3?ltsn=2000-06-14-002-01-ps"
    >Keeping Your Images from Adorning Other Sites</a>&quot;
    を参照してください。</p>
        <hr />

    <h3 align="CENTER">Apache HTTP Server</h3>
    <a href="./"><img src="images/index.gif" alt="Index" /></a>

  </body>
</html>
