[pod] [xml]

名前 (NAME)

Apache::SSI - Perl での Server Side Includes の実行

概要 (SYNOPSIS)

httpd.conf 内:

    <Files *.phtml>  # または何らか
    SetHandler perl-script
    PerlHandler Apache::SSI
    </Files>

あなたは Apache::SSI サブクラスで独自拡張ができます。もしそうするなら PERL_METHOD_HANDLERS=1 とあわせて mod_perl をコンパイルしてください (そうすれば オブジェクト指向継承が利用可能です)。そしてモジュールをこのように作って下さい:

    package MySSI;
    use Apache::SSI ();
    @ISA = qw(Apache::SSI);
    #埋め込みシンタックス:
    #<!--#something param=value -->
    sub ssi_something {
       my($self, $attr) = @_;
       my $cmd = $attr->{param};
       ...
       return $a_string;   
    }
 
 そして httpd.conf 内は:
 
    <Files *.phtml>
     SetHandler perl-script
     PerlHandler MySSI
    </Files>

説明 (DESCRIPTION)

Apache::SSI は、HTML サーバ解析処理のための mod_include の機能を実行します。 これは Apache の mod_perl 下で動作します。

私の考えでは、このモジュールが有用であるかも知れない、主な理由が二つあります: 独自カスタム SSI 命令を実行するためのサブクラスが使えます。そして/または、 他の mod_perl ハンドラの出力を解析出来、また、SSI 出力を他のハンドラへ 送ることができます (その場合 Apache::Filter を利用して下さい)。

各 SSI 命令は Apache::SSI の、接頭辞 "ssi_" のメソッドによって処理されます。 例えば、<!--#printenv--> は ssi_printenv メソッドによって処理されます。 SSI タグ内の属性=値のペアは、解析され、ハッシュリファレンスで メソッドに渡されます。

'Echo' 命令は、ssi_echo メソッドによって処理され、その委任されたメソッドが、 接頭辞 "echo_" のメソッドを調べます。例えば、<!--#echo var=DOCUMENT_NAME--> は echo_DOCUMENT_NAME メソッドに処理されます。

Apache::SSI から継承し 'ssi_*' や 'echo_*' メソッドをオーバーライドするか、 新規のメソッドを書くことにより、挙動をカスタマイズできます。

SSI 命令 (SSI Directives)

このモジュールは mod_include と同じ命令をサポートします。少なくとも、 それが目標です。=) 以下に一覧されながら、文書化されていないメソッドについては、 http://www.apache.org/ で mod_include のオンラインドキュメントをご覧下さい。

ハンドラのチェーン化 (CHAINING HANDLERS)

スタックされたハンドラのチェーン内にこのモジュールを存在させるため、 とても簡単な方法が二つあります。第一に Apache::Filter を使い、そして あなたの httpd.conf はこのような感じでしょう:

 PerlModule Apache::Filter
 PerlModule Apache::SSI
 PerlModule My::BeforeSSI
 PerlModule My::AfterSSI
 <Files ~ "\.ssi$">
  SetHandler perl-script
  PerlSetVar Filter On
  PerlHandler My::BeforeSSI Apache::SSI My::AfterSSI
 </Files>

"PerlSetVar Filter On" ディレクティブは三つのスタックされたハンドラに それらをフィルタリングモードにすべきだと命じます。これは必須です。

第二に Apache::OutputChain を使い、そしてあなたの httpd.conf は このような感じでしょう:

 PerlModule Apache::OutputChain
 PerlModule Apache::SSIChain
 PerlModule My::BeforeSSI
 PerlModule My::AfterSSI
 <Files ~ "\.ssi$">
  SetHandler perl-script
  PerlHandler Apache::OutputChain My::AfterSSI Apache::SSIChain My::BeforeSSI
 </Files>

このハンドラの順番は、二つの異なるメソッドで逆順にされる事に注意してください。 一つの理由は、私が書いた Apache::Filter は、順番をより直感的にさせます。 もう一つの理由は、Apache::SSI は、これ自体が Apache::Filter を使う スタックハンドラで使われる事が出来る事です。それゆえに、Apache::OutputChain と一緒に使われるには、Apache::SSIChain にラップされている必要があります。

より明確な情報は Apache::OutputChainApache::Filter のドキュメントを ご覧下さい。そして、警告 (CAVEATS) の中の注記も見てください。

警告 (CAVEATS)

* Apache::Filter を介してハンドラをチェーン化した時に、もし <!--#include ...--> または <!--#exec cgi=...--> を使う場合、Apache::SSI はチェーン内の最後のフィルタ でなければなりません。これは Apache::SSI がファイルのインクルードのために、 $r->lookup_uri(...)->run を使い、これは Perl の STDOUT ではなく、 むしろ C の stdout へ出力を送るからです。従い Apache::Filter には 出力の捕捉やフィルタが出来ません。

もし Apache::SSI がチェーン内の最後のフィルタであるか、あなたが <!--#fsize-->, <!--#flastmod--> 等の簡単な SSI 命令を貼り付けるのなら問題ないでしょう。

* 現在の、<!--#echo var=whatever--> が変数を探す方法は、最初に $r->subprocess_env を試み、次に %ENV を試み、そして五つの追加環境変数は mod_include が提供します。この順序は正しいでしょうか?

行うこと (TO DO)

http://www.apache.org/docs/mod/mod_include.html を再訪し、私が出来ることが 他に何かないかを見ること。

ファイルをインクルードする時に十分に発達したサブリクエストを実行するか、 または、ただファイルを開いて出力するか、このどちらかを選択させる "PerlSetVar ASSI_Subrequests 0|1" オプションを持つことは素敵でしょう。

real.t テストのために Apache::test の使い方を知りたい。

参考資料 (SEE ALSO)

mod_include, mod_perl(3), Apache(3), HTML::Embperl(3), Apache::ePerl(3), Apache::OutputChain(3)

作者 (AUTHOR)

Ken Williams ken@forum.swarthmore.edu

基本概念は Doug MacEachern dougm@osf.org によるオリジナルバージョン。 実装は異なる。

著作権 (COPYRIGHT)

Copyright 1998 Swarthmore College. All rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

翻訳者

谷口公一 <taniguchi@users.sourceforge.jp>