9.13. フィルタを使用する(mod_include)

Apache2.0 に実装された新機能に mod_include モジュールで提供されるフィルタがあります。Turbolinux 10 Server の /etc/httpd/conf/modules には以下の記述があり、mod_include はデフォルトで読み込まれています。

LoadModule include_module       /usr/lib/httpd/modules/mod_include.so

フィルタは、クライアントとサーバーの間で送受信されるデータへの処理プロセスです。クライアントからサーバーに送られるデータは入力フィルタとして、サーバーからクライアントへのデータは出力フィルタとして処理することにより、Apache に入出力されるデータを加工するためのメカニズムを提供します。Apache1.3 からの大きな変更点としては、従来ハンドラとして実装されていた SSI(Server Side Include)が、Apache2.0 ではフィルタとして提供されています。

SSI は、動的なコンテンツを提供する仕組みの 1 つです。CGI スクリプトなどが HTML ファイルのすべてを生成するのに対し、SSI では、静的な HTML ファイルの一部にコマンドの実行結果を組み込みます。例えば、HTML ファイルにタイムスタンプやコピーライトなどを挿入する際に利用されています。Apache1.3 で SSI を有効にするには、AddHandler ディレクティブを使用して以下のように設定する必要がありました。

Addtype    text/html      .shtml
AddHandler server-parsed  .shtml

これに対し、Apache2.0 で SSI を有効にするには、AddOutputFilter ディレクティブを使用します。書式は以下の通りです。

AddOutputFilter filter[;filter...] extension [extension ...]

指定された拡張子を持つファイルに対して、filter で指定したフィルタを適用します。

現在、Apache2.0 で提供されているフィルタは、INCLUDES と DEFLATE の 2 つだけです。SSI の機能は、INCLUDES フィルタにより提供されています。DEFLATE フィルタは、クライアントへ送るデータを gzip 圧縮するためのフィルタで、mod_deflate モジュールにより提供されている機能です。したがって、Apache2.0 で SSI を有効にするには、/etc/httpd/conf/httpd.conf に以下のように設定します。

Addtype         text/html  .shtml
AddOutputFilter INCLUDES   .shtml

Turbolinux 10 Server の /etc/httpd/conf/httpd.conf には、標準で上記の設定が記述されていますので、デフォルトで INCLUDES フィルタは機能しています。ただし、SSI を使用可能にするには、CGI の場合と同様にコンテンツを格納するディレクトリの Options ディレクティブに、IncludesNOEXEC を指定し、SSI の実行を許可するようにアクセス制限の設定を行う必要があります。(詳細については、項9.9 を参照)

<Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
    <Limit GET POST OPTIONS PROPFIND>
        Order allow,deny
        Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS PROPFIND>
        Order deny,allow
        Deny from all
    </LimitExcept>
<Directory>

この設定により各ユーザーは、~/public_html/ ディレクトリに格納した .shtml という拡張子のファイルを SSI として実行することが可能になります。

なお、フィルタに関連するディレクティブは、AddOutputFilter 以外にも SetInputFilter、SetOutputFilter、AddInputFilter, AddOutputFilter、RemoveInputFilter、RemoveOutputFilter などが存在します。例えば、特定のディレクトリ以下にあるすべてのファイル対して INCLUDES フィルタを適用したいのであれば、SetOutputFilter を使用して以下のように設定することが可能です。

<Directory /var/www/html/data>
    SetOutputFilter INCLUDES
</Directory>

ティップ

SSI を利用するためのもう一つの指定方法として XbitHack ディレクティブがあります。上記の設定に加えて以下を指定することにより、SSI を含む HTML ファイルの拡張子を、.html から .shtml に変更する必要がなくなります。XbitHack On はファイルの所有者が実行権限を持つ html ファイルを SSI として処理します。

 XBitHack on