Optionsディレクティブ:ディレクトリで使用可能な機能を設定する

Options ディレクティブは、対象のディレクトリに対して使用可能な機能を設定する場合に使用します。設定可能な機能として(1)CGIの実行、(2)シンボリックリンクをたどることができる、(3)SSIを有効にする、(4)ファイル一覧の表示、などがあります。ここでは Apache の Options ディレクティブの使い方について解説します。

(Last modified: )

Optionsディレクティブの書式

Options ディレクティブを使用すると対象のディレクトリに対して使用可能な機能を追加したり削除したりすることができます。書式は次のとおりです。

Options オプション [オプション] ...
Options [+|-]オプション [[+|-]オプション] ...

記述できる場所は httpd.conf, VirtualHost, Directory, .htaccess です。 .htaccess で設定する場合は AllowOverride Options が設定されている必要があります。

設定する機能をオプションとして指定します。指定可能なオプションは次の通りです。

All             MultiViews 以外のすべての機能を有効にする(デフォルト)
None            すべての機能を無効にする
ExecCGI         CGI スクリプトの実行を許可する
FollowSymLinks  シンボリックリンクをたどることを許可する
Includes        SSI を有効にする
IncludesNOEXEC  SSI を有効にする(#exec コマンド と #exec CGI は無効) 
Indexes         ファイル一覧の表示を行う
MultiViews      コンテントネゴシエーションを有効にする
SymLinksIfOwnerMatch  同じオーナーの場合だけシンボリックリンクをたどれる

それぞれのオプションの詳細はこのあとで解説します。

Optionsディレクティブの記述方法

Options ディレクティブはディレクトリに対して使用するため、 Directory ディレクティブのブロック内で記述するか .htaccess ファイルの中で記述します。例えば d:\pg\Apache\Apache24\htdocs ディレクトリに対して Option ディレクティブを設定する場合は次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  Options オプション1 オプション2 ...
</Directory>

※ Directory ディレクティブについては「Directoryディレクティブ/DirectoryMatchディレクティブ:設定が適用されるディレクトリを指定する」を参照されてください。

すべての機能を有効または無効にする

すべての機能を有効にするには All を指定します。(ただし MultiViews だけは有効とならないため、別途指定が必要です)。

<Directory d:/pg/Apache/Apache24/htdocs>
  Options All
</Directory>

すべての機能を無効にするには None を指定します。

<Directory d:/pg/Apache/Apache24/htdocs>
  Options None
</Directory>

有効にする機能を上書きで指定する

特定の機能を指定して有効にするには、有効にする機能を半角スペースで区切って記述してください。例えば ExecCGI と Includes の 2 つの機能を有効にするには次のように記述します。

<Directory d:/pg/Apache/Apache24/htdocs>
  Options ExecCGI Includes
</Directory>

このように + まはた - を使わないで機能を有効した場合、設定前にどのような機能が有効にになっていたかに関わらず新しく設定した機能だけが有効となります。例えば次のように親ディレクトリと子ディレクトリでそれぞれ Options ディレクティブが設定されている場合で考えてみます。

<Directory d:/pg/Apache/Apache24/htdocs>
  Options Includes
</Directory>

<Directory d:/pg/Apache/Apache24/htdocs/blog>
  Options ExecCGI
</Directory>

htdocs/blog ディレクトリには、親ディレクトリに対する Options ディレクティブの設定と、自分自身のディレクトリに対する Options ディレクティブの設定が順に適用されます(上位のディレクトリに対する設定から順に適用されます)。ただ追加で適用されていくのではなく上書きで適用されていくため、親ディレクトリに対する設定で Includes が有効に設定されていますが、自分自身のディレクトリに対する設定で上書きされるため ExecCGI だけが有効となり Includes は有効とはなりません。

機能を追加または削除する

既存の設定を上書きするのではなく、機能を追加したり既存の設定から削除したりする場合はオプションの前に + または - を付けます。

Options +オプション
Options -オプション

次の例をみてください。

<Directory d:/pg/Apache/Apache24/htdocs>
  Options Includes ExecCGI
</Directory>

<Directory d:/pg/Apache/Apache24/htdocs/blog>
  Options +FollowSymLinks -ExecCGI
</Directory>

htdocs/blog ディレクトリには、まず親ディレクトリに対する Options ディレクティブの設定で Includes と ExecCGI が有効になり、そのあとで自分自身のディレクトリに対する Options ディレクティブの設定で FollowSymLinks が追加で有効となり ExecCGI が無効となります。結果的に htdocs/blog ディレクトリには Includes と FollowSymLinks が有効となります。

ExecCGI

ここからは個別の機能について解説していきます。最初は ExecCGI です。 ExecCGI が有効になっている場合、対象のディレクトリ内で CGI のプログラムを実行することができます。

Options ExecCGI

Apache で CGI を利用できるようにするには二つの方法があります。一つ目は ScriptAlias ディレクティブを使う方法です。

ScriptAlias /cgi-bin/ D:/pg/Apache/Apache24/cgi-bin/

この場合、 D:/pg/Apache/Apache24/cgi-bin/ ディレクトリの中にあるすべてのファイルは cgi-script ハンドラで処理される CGI スクリプトとして扱われます。(詳しくは「ApacheからCGI(Perl)を利用できるように設定する」を参照されてください)。

もうひとつの方法は Options ExecCGI ディレクティブを使う方法です。

<Directory D:/pg/Apache/Apache24/htdocs/mydir>
  Options +ExecCGI
  AddHandler cgi-script .cgi .pl
</Directory>

ExecCGI を有効にすると対象のディレクトリで CGI スクリプトの実行が許可されます。あわせて AddHandler ディレクティブを使って指定した拡張子のファイルを cgi-script ハンドラで処理するように設定します。上記の設定であれば .cgi と .pl の拡張子のファイルは CGI スクリプトが記述されたファイルとして実行され、その結果をクライアントに返します。(詳しくは「ドキュメントルート以下の任意のディレクトリでCGIを実行する」を参照されてください)。

サンプル

それでは実際に試してみます。ドキュメントルートの中に user ディレクトリを作成し、ディレクトリの中に test.pl ファイルを設置しました。

ExecCGI(1)

test.pl ファイルの内容は次のようになっています。

#!C:/pg/Strawberry/perl/bin/perl

print "Content-type: text/html;\n\n";
print "<html><body><p>Test CGI</p></body><html>\n";

最初に ExecCGI を有効にせずに試してみます。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options -ExecCGI
</Directory>

ブラウザから http://localhost/user/test.pl へアクセスします。するとファイルの内容がそのまま画面に表示されました。

ExecCGI(2)

次に AddHandler ディレクティブを使って拡張子 .pl のファイルを CGI スクリプトが記述されたファイルと関連付けました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options -ExecCGI
  AddHandler cgi-script .cgi .pl
</Directory>

ブラウザから http://localhost/user/test.pl へアクセスします。すると CGI を実行する許可がないため 403 Forbidden エラーが発生しました。

ExecCGI(3)

最後に ExecCGI を有効にします。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options +ExecCGI
  AddHandler cgi-script .cgi .pl
</Directory>

ブラウザから http://localhost/user/test.pl へアクセスします。するとファイルが実行され、その結果がブラウザに表示されました。

ExecCGI(4)

FollowSymLinks / SymLinksIfOwnerMatch

続いて FollowSymLinks です。 FollowSymLinks が有効になっている場合、対象のディレクトリ内でシンボリックリンクをたどることができるようになります。

Options FollowSymLinks

また SymLinksIfOwnerMatch が有効になっている場合、シンボリック先のファイルやディレクトリがシンボリックリンクの所有ユーザ ID と同じ場合にのみシンボリックリンクをたどることができます。

Options SymLinksIfOwnerMatch
サンプル

それでは実際に試してみます。ドキュメントルートの中に user ディレクトリを作成し、ディレクトリの中に d:\pg\Apache\Apache24\htdocs\sub\hello.html へのシンボリックリンク hey.html を作成す。コマンドプロンプトを管理者権限で起動し、 d:\pg\Apache\Apache24\htdocs\user ディレクトリへ移動したあと次のように実行してください。

mklink hey.html D:\pg\Apache\Apache24\htdocs\sub\hello.html

FollowSymLinks / SymLinksIfOwnerMatch(1)

※ Windows 環境でシンボリックリンクを作成する方法は「シンボリックリンクの作成(MKLINK)」を参照されてください。

user ディレクトリを確認してみるとシンボリックリンクが作成されています。

FollowSymLinks / SymLinksIfOwnerMatch(2)

最初に FollowSymLinks を有効にせずに試してみます。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options -FollowSymLinks
</Directory>

ブラウザから http://localhost/user/hey.html へアクセスします。するとシンボリックリンクをたどることができないため 403 Forbidden エラーが発生しました。

FollowSymLinks / SymLinksIfOwnerMatch(2)

次に FollowSymLinks を有効にします。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options +FollowSymLinks
</Directory>

ブラウザから http://localhost/user/hey.html へアクセスします。今度はシンボリックリンクをたどって、 /sub/hello.html ファイルの内容が画面に表示されました。

FollowSymLinks / SymLinksIfOwnerMatch(3)

Includes / IncludesNOEXEC

続いて Includes です。 Includes が有効になっている場合、対象のディレクトリ内で SSI(Server Side Includes) が有効となります。

Options Includes

また IncludesNOEXEC が有効になっている場合、 SSI は有効ですが #exec コマンドは利用できません。

Options IncludesNOEXEC

SSI を利用する場合は、 SSI で使用するファイルの拡張子に対して次のような設定をあわせて記述する必要があります。(下記はファイルの拡張子が .shtml を使用する場合です)。

Options Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
サンプル

それでは実際に試してみます。ドキュメントルートの中に user ディレクトリを作成し、ディレクトリの中に hello.shtml ファイルを設置しました。

Includes / IncludesNOEXEC(1)

hello.shtml ファイルの内容は次のようになっています。

<html><body>
<h1>Hello</h1>
<!--#echo var="DATE_LOCAL" -->
</body></html>

SSI についてここでは詳しい説明は行いませんが、下記の部分が SSI によって書き換えられる部分です。

<!--#echo var="DATE_LOCAL" -->

最初に Includes を有効にせずに試してみます。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options -Includes
</Directory>

ブラウザから http://localhost/user/hello.shtml へアクセスします。すると SSI の部分は単にコメントとして処理されてページが表示されます。

Includes / IncludesNOEXEC(2)

次に Includes を有効にします。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options +Includes
  AddType text/html .shtml
  AddOutputFilter INCLUDES .shtml
</Directory>

ブラウザから http://localhost/user/hello.shtml へアクセスします。今度はリクエストがあったときに現在の日時の情報を取得し、ページ内の SSI の部分を現在日時の情報に書き換えてからページが表示されます。

Includes / IncludesNOEXEC(3)

Indexes

続いて Indexes です。 Indexes が有効になっている場合、クライアントからのリクエストがディレクトリに対するもので、且つ DirectoryIndex ディレクティブで指定されたファイル( index.html や index.php など)が存在しない場合、対象のディレクトリに含まれるファイルやサブディレクトリの一覧を表示します。

Options Indexes

DirectoryIndex ディレクティブはクライアントからのリクエストがディレクトリに対するものだった場合に、指定したファイルを代わりに表示するものです。詳しくは「DirectoryIndexディレクティブ:ディレクトリへのリクエストに対してどのファイルを返すのか」を参照されてください。

サンプル

それでは実際に試してみます。ドキュメントルートの中に user ディレクトリを作成し、ディレクトリの中に次のようなファイルとサブディレクトリを作成しました。

Indexes(1)

最初に Indexes を有効にせずに試してみます。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options -Indexes
</Directory>

ブラウザから http://localhost/user/ へアクセスします。すると 403 Forbidden エラーとなりました。

Indexes(2)

次に Indexes を有効にします。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options +Indexes
</Directory>

ブラウザから http://localhost/user/ へアクセスします。今度は対象のディレクトリに含まるファイルとサブディレクトリの一覧が表示されました。

Indexes(3)

MultiViews

最後に MultiViews です。 MultiViews が有効になっている場合、コンテントネゴシエーションが有効になります。

Options MultiViews

コンテントネゴシエーションについてここでは詳細な解説は行いませんが、リクエストに含まれる言語に関する情報から適切なファイルをクライアントへ返すようにしたり、拡張子が省略されたリクエストに対して適切と思われるファイルを自動的に選択してクライアントへ返すことができます。

なお Options ディレクティブで All を指定するとすべての機能が有効になりますが、 All を指定しても MultiViews だけは有効となりません。すべての機能に加えて MultiViews を有効にするには明示的に MultiViews をあわせて指定してください。

Options All MultiViews
サンプル

それでは実際に試してみます。ドキュメントルートの中に user ディレクトリを作成し、ディレクトリの中に hello.html ファイルを設置しました。

MultiViews(1)

ブラウザから http://localhost/user/hello.html へアクセスすると次のように表示されます。

MultiViews(2)

最初に MultiViews を有効にせずに試してみます。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options -MultiViews
</Directory>

ブラウザから http://localhost/user/hello へアクセスします(拡張子を省略した hello へアクセスしています)。 MultiViews が無効となっており、また hello という名前のディレクトリも存在しないため 404 Not Found エラーとなります。

MultiViews(3)

次に MultiViews を有効にします。 httpd.conf ファイルに次のように記述しました。

<Directory D:/pg/Apache/Apache24/htdocs/user>
  Options +MultiViews
</Directory>

ブラウザから http://localhost/user/hello へアクセスします。今度はコンテントネゴシエーションの機能によって hello.html がクライアントへ返されました。

MultiViews(4)

-- --

Apache の Options ディレクティブの使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。