CGI 環境の PATH_INFO の変更

### Apache HTTP Server

# CGI 環境の PATH_INFO の変更

## 概要

Apache 1.1.1 およびそれ以前のバージョンで実装されていた CGI 環境で PATH_INFO を作成する方法は直観的でなく、 場合によってはクラッシュすることもありました。 Apache 1.2 及びそれ以降において、この動作が変更されました。 このことにより特定の古い CGI アプリケーションにおいていくつか 互換性の問題が生じることがありますが、それでも Apache 1.2 の動作は CGI/1.1 仕様と互換があり、CGI スクリプトは容易に修正できます(以下参照)。

## 問題

Apache 1.1.1 およびそれ以前では、URL ではなくファイル名を参照して PATH_INFO と SCRIPT_NAME 環境変数を設定していました。 多くの場合はこれが正しい結果を返しますが、パス情報を含むように filesystem パスがオーバーロードされた場合は、 誤った結果を返す場合がありました。 たとえば、設定ファイルに以下がある場合

         Alias /cgi-ralph /usr/local/httpd/cgi-bin/user.cgi/ralph

この場合、`user.cgi` は CGI スクリプトであり、 "/ralph" は、CGI に渡される情報です。もし上の設定がなされていて、 "`/cgi-ralph/script/`" へのリクエストが来れば、 PATH_INFO には "`/ralph/script/`" が、 SCRIPT_NAME には "`/cgi-`" が設定されます。 明らかに、後者は間違っています。特定の場合には、これにより サーバがクラッシュすることさえありました。

## 解決

Apache 1.2 以降では SCRIPT_NAME と PATH_INFO の決定には URL を直接参照して、URL のどれだけの部分がクライアントが変更可能なのかを確定させた上で PATH_INFO を設定するようになりました。上の例では、PATH_INFO には "`/script`" が、SCRIPT_NAME には "`/cgi-ralph`" が設定されます。 これは正しく、さらに、サーバの動作に問題を起こすこともありません。また、 "`http://$SERVER_NAME:$SERVER_PORT$SCRIPT_NAME$PATH_INFO`" が、常に最新のスクリプトを指す、アクセス可能な URL であることを 保証します。これは、以前のバージョンの Apache では必ずしもそうとは限らなかったことです。

しかし `Alias` ディレクティブからの "`/ralph`" 情報は失われます。 これは残念ですが、filesystem を通してこの種類の情報を 渡すのは薦められた方法ではなく、 またそれを使ったスクリプトは動作しなくても当然だと考えます。 ただし、Apache 1.2b3 以降では代替手段を用意しています。

## 以前のサーバとの互換性

以前のバージョンの Apache や他のサーバ向けに設計された スクリプトには古い PATH_INFO 変数により提供される情報が 必要であるかもしれません。 この目的のために、 Apache 1.2 (1.2b3 以降) では追加の変数、FILEPATH_INFO を設定します。この環境変数には、Apache 1.1.1 で PATH_INFO であったであろう値が設定されます。

Apache 1.2 およびそれ以前のバージョンの両方で動作させたいスクリプトは、 FILEPATH_INFO の存在を単に調べて、それがあれば 使う、ということができます。そうでなければ、PATH_INFO を使うことができます。たとえば、Perl では次のものを使うことができます

        $path_info = $ENV{'FILEPATH_INFO'} || $ENV{'PATH_INFO'};

これにより、スクリプトはすべてのバージョンの Apache を含む、 CGI/1.1 をサポートするすべてのサーバで動作することができます。

### Apache HTTP Server