Alias と ScriptAlias の概念はApacheディレクティブ設定の基本を理解する上で非常に重要です。セキュリティにも関係します。ここではホームページ制作や開発環境下での サーバー構築を例に、Alias と ScriptAlias について解説しています。
ドキュメントルート外でのCGI実行を実現するには、現実的ではないバーチャルホスト、シンボリックを除いて、二通りの方法があります。 ScriptAlias を使う方法と [ Alias / ディレクティブ ] + [ ディレクティブオプション ] の組み合わせで指定を行なう方法です。
以下のようにドキュメントルート外のディレクトリをディレクティブで CGI 実行の指定を行なっても動きません。なぜなら、ブラウザに対してどのアドレスに表示してよいのか、Apacheには解らないからです。
<Directory /Project_data/work/cgi-bin> → ドキュメントルート外
Options +ExecCGI
AddHandler cgi-script .cgi .pl
</Directory>
このような場合は、以下の様に Alias を使ってドキュメントルートにマッピングを行なう必要があります。
Alias /PROJECTS/work01/ "/Project_data/work01/"
<Directory /data01/work/cgi-bin> → ドキュメントルート外
Options +ExecCGI
AddHandler cgi-script .cgi .pl
</Directory>
Aliasの指定により、実際のディレクトリ/Project_data/work01/の内容を
http://mydomain.net/PROJECTS/work01/ → Alias処理されたアドレス
のアドレスで表示するように指定されています。 cgi-binディレクトリは Alias によりマッピングされた/Project_data/work01/ 以下にあるので Apacheは何処に表示すれば良いのか理解する亊ができます。よってディレクティブオプションでCGI実行を許可する指定が通ります。
ScriptAlias の扱いはAliasとまったく同じです。異なる点は、ScriptAliasでマッピング処理されたファイルディレクトリは CGI が実行可能になります。
ScriptAlias /PROJECTS/work01/cgi-bin/ /Project_data/work/cgi-bin/
ドキュメントルート外での公開はAliasを使用する以外にシンボリックを使う方法があります。 ディレクティブ設定でシンボリックを有効にするようにオプションを指定する必要がありますが、一般的にサーバー負荷が高くなるため、セキュリティ上、管理面での利用はお勧めできませんので、ここでは割愛します。
/PROJECTS/work01/cgi-bin/ このように末尾にも " / " を指定した場合、
http://mydomain.net/PROJECTS/work01/cgi-bin
ではアクセスできません。
http://mydomain.net/PROJECTS/work01/cgi-bin/
でアクセスが可能になりますので注意してください。ディレクティブ指定で末尾に " / "を付けた場合、Apache はディレクトリとしてしか認識しないので注意が必要です。
参照 URL => Googlebotとデフォルトファイル
HTML 制作者がアンカータグを指定する場合に関係してきますので、注意する必要があります。 これらの、ディレクトリに関するApache の挙動は、mod_dir モジュールで行われます。これらの設定に関しては、下記ドキュメントを参考にして下さい。 (Apache2)
参照 URL => Apache モジュール mod_dir
参照元のディレクトリ名とマッピングされてる名前が重複しないように注意します。
例えば、
ScriptAlias /cgi-bin/ /hogehoge/projects/cgi-bin
とし、従来の/cgi-bin/ ディレクトリにマッピングする場合、/hogehoge/projects/cgi-bin に設置したスクリプトをデフォルトの cgi-bin ディレクトリにあるかのように処理する事も出来ますが、この異なる二つのディレクトリに、同名のディレクトリ、スクリプトが存在した場合、エラーになります。
ドキュメントルートにおいては、トップの階層から下っていくだけなので、どの位置に表示すべきかはApacheは容易に理解できます。これらに例外を設けるのが Alias 及び ScliptAlias の役割と考えると解り易いと思います。つまり、内部的に階層構造を処理する事で、FTPなどの外部からの接続と公開(CGI 実行)ディレクトリを物理的に遮断する事が可能になるという訳です。