<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Apache チュートリアル: Server Side Includes 入門</title>
<!-- link rev="made" href="mailto:rbowen@rcbowen.com" -->
</head>
<!-- English revision: 1.7 -->
<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#000080"
alink="#FF0000">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta name="generator" content="HTML Tidy, see www.w3.org" />

    <title></title>
  </head>

  <body>
    <div align="CENTER">
      <img src="../images/sub.gif" alt="[APACHE DOCUMENTATION]" /> 

      <h3>Apache HTTP Server Version 2.0</h3>
    </div>
  </body>
</html>


<h1 align="CENTER">Apache チュートリアル: Server Side Includes 入門</h1>

<a name="__index__"></a> <!-- INDEX BEGIN -->
 

<ul>
<li><a href="#apachetutorial:introductiontoserversideincludes">Apache
 チュートリアル: Server Side Includes 入門</a></li>

<li><a href="#whataressi">SSI とは?</a></li>

<li><a href="#configuringyourservertopermitssi">SSI を許可するための
サーバの設定</a></li>

<li><a href="#basicssidirectives">基本的な SSI ディレクティブ</a>

<ul>
  <li><a href="#today'sdate">今日の日付</a></li>

  <li><a href="#modificationdateofthefile">ファイルの変更日</a></li>

  <li><a href="#includingtheresultsofacgiprogram">CGI プログラムの結果を
取り込む</a></li>
</ul>
</li>

<li><a href="#additionalexamples">追加の例</a>

<ul>
<li><a href="#whenwasthisdocumentmodified">いつこのドキュメントは
修正されたのか?</a></li>

<li><a href="#includingastandardfooter">標準のフッタを挿入する</a></li>

<li><a href="#whatelsecaniconfig">他に何が設定できるのか?</a></li>

<li><a href="#executingcommands">コマンドの実行</a></li>
</ul>
</li>

<li><a href="#advancedssitechniques">高度な SSI テクニック</a>

<ul>
<li><a href="#settingvariables">変数を設定する</a></li>

<li><a href="#conditionalexpressions">条件式</a></li>
</ul>
</li>

<li><a href="#conclusion">終わりに</a></li>
</ul>

<!-- INDEX END -->
<hr>
<h2><a name=
"apachetutorial:introductiontoserversideincludes">Apache
チュートリアル: Server Side Includes 入門</a></h2>

<table border="1">
<tr>
<td valign="top"><strong>関連モジュール</strong><br>
<br>
 <a href="../mod/mod_include.html">mod_include</a><br>
<a href="../mod/mod_cgi.html">mod_cgi</a><br>
<a href="../mod/mod_expires.html">mod_expires</a><br>
 </td>
<td valign="top"><strong>関連ディレクティブ</strong><br>
<br>
 <a href="../mod/core.html#options">Options</a><br>
<a href="../mod/mod_include.html#xbithack">XBitHack</a><br>
<a href="../mod/mod_mime.html#addtype">AddType</a><br>
<a href="../mod/mod_mime.html#addhandler">AddHandler</a><br>
<a href=
"../mod/mod_setenvif.html#BrowserMatchNoCase">BrowserMatchNoCase</a><br>

 </td>
</tr>
</table>

<p>この文書は最初、Apache Today (http://www.apachetoday.com/) に三回の連載記事として掲載されました。
ここでは、ApcheToday と Internet.com との協定により載せています。</p>

<p>この記事は、通常は単に SSI と呼ばれる Server Side Includes を
扱います。この記事においては、サーバでの SSI を許可するための設定と、
現在の HTML ページに動的なコンテンツを加えるためのいくつかの基本的な
SSI 技術を紹介します。</p>

<p>記事の後半では、SSI ディレクティブで
SSI と共に実行することができる条件文のような幾分高度な事柄に
ついて述べています。</p>

<hr>
<h2><a name="whataressi">SSI とは?</a></h2>

<p>SSI (Server Side Includes) は、HTML ページ中に配置されるディレクティブであり、
サーバでページを提供する時に評価されます。
SSI は、CGI プログラムやその他の動的な技術で全てのページを提供
せずに、動的に生成されたコンテンツを現在の HTML ページに
加えます。</p>

<p>どういう場合に SSI を使い、どういう場合にプログラムでページを完全に生成するか
は、ページのうちどの程度が静的であり、ページが提供されるたびに
再計算する必要がどの程度あるかで通常は決定します。SSI は現在時刻のような
小さい情報を加えるにはうってつけの方法です。
しかし、そのページのほとんどの部分が提供時に生成される場合は、
他の方法を探す必要があります。</p>

<hr>
<h2><a name="configuringyourservertopermitssi">SSI を許可するための
サーバの設定</a></h2>

<p>サーバで SSI 許可するには、<code>httpd.conf</code> ファイル
または <code>.htaccess</code> ファイルに次のディレクティブを指定する必要があります:</p>

<pre>
        Options +Includes
</pre>

<p>この指定は、ファイルを SSI ディレクティブで解析させることを許可する
ということを Apache に伝えます。</p>

<p>全てのファイルが SSI ディレクティブで解析されるというわけではありません。
どのファイルが解析されるかを Apache に伝える必要があります。これを
行なうには二つ方法があります。次のディレクティブを使うことで、
例えば <code>.shtml</code> のような特別なファイル拡張子を持つファイルを
解析するよう Apache に伝えることができます:</p>

<pre>
        AddType text/html .shtml
        AddHandler server-parsed .shtml
</pre>

<p>この方法の欠点は、もし現在のページに SSI 
ディレクティブを加えたい場合、それらのディレクティブが実行される
ように <code>.shtml</code> 拡張子にするため、そのページの名前と、
そのページへの全てのリンクを変更しなければならないことです。</p>

<p>もう一つの方法は、<code>XBitHack</code> ディレクティブを使用することです:</p>

<pre>
        XBitHack on
</pre>

<p><code>XBitHack</code> は、ファイルの実行ビットが立っている場合、
SSI ディレクティブにより解析することを Apache に伝えます。従って、
SSI ディレクティブを現在のページに加えるためには、ファイル名を変更しなくてもよく、
単に <code>chmod</code> を使用してファイルを実行可能にする
だけで済みます。</p>

<pre>
        chmod +x pagename.html
</pre>

<p>行なうべきではないことに関する短いコメント。時々誰かが、
全ての <code>.html</code> ファイルを SSI で解析するよう Apache に伝えれば、
わざわざ <code>.shtml</code> というファイル名にする必要がないといって
薦めるのを見ることでしょう。こういう人たちは、おそらく <code>XBitHack</code>
について聞いたことがないのでしょう。この方法について注意することは、
たとえ SSI ディレクティブを全く含まない場合でも、Apache がクライアントに
送る全てのファイルを最後まで読み込ませることになります。
この方法はかなり処理を遅くするものであり、良くないアイデアです。</p>

<p>もちろん、Windows ではそのような実行ビットをセットするようなものは
ありませんのでオプションが少し制限されています。</p>

<p>デフォルトの設定では、Apache は SSI ページについて最終変更時刻や
コンテンツの長さを HTTP ヘッダに送りません。
動的なコンテンツであるため、それらの値を計算するのが難しいからです。
このためドキュメントが
キャッシュされなくなり、結果としてクライアントの性能が
遅くなったように感じさせることになります。
これを解決する方法が二つあります:</p>

<ol> 

<li><code>XBitHack Full</code> 設定を使用する。この設定により、もともと要求された
ファイルの時刻を参照し、読み込まれるファイルの変更時刻を
無視して最終変更時刻を決定するよう Apache に伝えます。</li>

<li><a href="../mod/mod_expires.html">mod_expires</a> で提供されているディレクティブを使用して、
ファイルが無効になる時刻を明示します。
これにより、ブラウザとプロキシにキャッシュが有効であることを通知します。</li>

</ol>

<hr>
<h2><a name="basicssidirectives">基本的な SSI ディレクティブ</a></h2>

<p>SSI ディレクティブは以下の文法で記述します:</p>

<pre>
        &lt;!--#element attribute=value attribute=value ... --&gt;
</pre>

<p>HTML のコメントのような書式をしているので、もし SSI を
正しく動作可能にしなければ、ブラウザはそれを無視するでしょう。しかし、
HTML ソース中では見えます。もし SSI を正しく設定したなら、
ディレクティブはその結果と置き換えられます。</p>

<p>element はたくさんあるものから一つ指定することができます。
指定できるものの大多数については、次回もう少し詳しく説明します。
ここでは、SSI で行なうことができる例をいくつか示します。</p>

<h3><a name="today'sdate">今日の日付</a></h3>

<pre>
        &lt;!--#echo var="DATE_LOCAL" --&gt;
</pre>

<p><code>echo</code> 要素は単に変数の値を出力します。CGI プログラムに
利用可能な環境変数の全てのセットを含む多くの標準変数があります。
また、<code>set</code> 要素を用いることで、独自の変数を定義することが
できます。</p>

<p>出力される日付の書式が好きではない場合、その書式を
修正するために、<code>config</code> 要素に <code>timefmt</code> 属性を
使用することができます。</p>

<pre>
        &lt;!--#config timefmt="%A %B %d, %Y" --&gt;
        Today is &lt;!--#echo var="DATE_LOCAL" --&gt;
</pre>

<h3><a name="modificationdateofthefile">ファイルの変更日</a></h3>

<pre>
        This document last modified &lt;!--#flastmod file="index.html" --&gt;
</pre>

<p>この要素も <code>timefmt</code> フォーマットの設定に従います。</p>

<h3><a name="includingtheresultsofacgiprogram">CGI プログラムの結果を取り込む
</a></h3>

<p>これは、全ての人のお気に入りである ``ヒットカウンタ'' のような CGI プログラムの
結果を出力する SSI のより一般的な使用のうちの一つです。</p>

<pre>
        &lt;!--#include virtual="/cgi-bin/counter.pl" --&gt;
</pre>

<hr>
<h2><a name="additionalexamples">追加の例</a></h2>

<p>以下は、SSI を使用して HTML ドキュメントにおいてできることの
いくつかの特別な例です。</p>

<hr>
<h2><a name="whenwasthisdocumentmodified">いつこのドキュメントは修正されたのか?
</a></h2>

<p>先に、ドキュメントが最後に変更されたのはいつかをユーザに通知するために SSI を使用することができることを
述べました。しかしながら、実際の方法は、いくぶん問題のままにしておきました。
HTML ドキュメントに配置された次のコードは、ページに
そのようなタイムスタンプを入れるでしょう。もちろん、上述の
ように、SSI を正しく動作可能にしておく必要があります。</p>

<pre>
        &lt;!--#config timefmt="%A %B %d, %Y" --&gt;
        This file last modified &lt;!--#flastmod file="ssi.shtml" --&gt;
</pre>

<p>もちろん、<code>ssi.shtml</code> の部分を実際の当該ファイル名と
置き換える必要があります。もし、あらゆるファイルに張ることが
できる一般的なコードを探しているなら、これは不便であるかもしれません。
おそらくその場合は、そうする代わりに変数 <code>LAST_MODIFIED</code>
を使用したいと考えるでしょう:</p>

<pre>
        &lt;!--#config timefmt="%D" --&gt;
        This file last modified &lt;!--#echo var="LAST_MODIFIED" --&gt;
</pre>

<p><code>timefmt</code> 書式についてのより詳細については、
お好みの検索サイトに行き、<code>ctime</code> で検索してみてください。文法は同じです。</p>

<hr>
<h2><a name="includingastandardfooter">標準のフッタを挿入する</a></h2>

<p>もし数ページを超えるページを持つサイトを管理しているならば、
全ページに対して変項を行なうことが本当に苦痛となり得ることが分かるでしょう。
全てのページに渡ってある種の標準的な外観を維持しようと
しているならば特にそうでしょう。</p>

<p>ヘッダやフッタ用の挿入用ファイルを使用することで、このような
更新にかかる負担を減らすことができます。一つのフッタファイルを
作成し、それを <code>include</code> SSI コマンドで各ページに
入れるだけで済みます。<code>include</code> 要素は、<code>file</code> 属性
または <code>virtual</code> 属性のいずれかを使用してどのファイルを挿入するかを
決めることができます。<code>file</code> 属性は、<em>カレントディレクトリからの
相対パスで示された</em>ファイルパスです。それは
/ で始まる絶対ファイルパスにはできず、また、そのパスの一部に ../ を
含むことができないことを意味します。<code>virtual</code> 属性は、おそらく
より便利だと思いますが、提供するドキュメントからの相対 URL で指定すべきです。
それは / で始めることができますが、提供するファイルと同じサーバ上に
存在しなくてはなりません。</p>

<pre>
        &lt;!--#include virtual="/footer.html" --&gt;
</pre>

<p>私は最後の二つを組み合わせて、<code>LAST_MODIFIED</code> ディレクティブを
フッタファイルの中に置くことがよくあります。
SSI ディレクティブは、挿入用のファイルに含ませたり、
挿入ファイルのネストをしたりすることができます。すなわち、
挿入用のファイルは他のファイルを再帰的に挿入することができます。</p>

<hr>
<h2><a name="whatelsecaniconfig">他に何が設定できるのか?</a></h2>

<p>時刻書式を <code>config</code> で設定できることに加えて、
更に二つ <code>config</code> で設定することができます。</p>

<p>通常、SSI ディレクティブで何かがうまくいかないときは、次のメッセージが
出力されます。</p>

<pre>
        [an error occurred while processing this directive]
</pre>

<p>このメッセージを他のものにしたい場合、
<code>config</code> 要素の <code>errmsg</code> 属性で変更することが
できます:<p>

<pre>
        &lt;!--#config errmsg="[It appears that you don't know how to use SSI]" --&gt;
</pre>

<p>おそらく、エンドユーザはこのメッセージを決して見ることはありません。
なぜなら、そのサイトが生きた状態になる前に SSI ディレクティブに関する
全ての問題を解決しているはずだからです。(そうですよね?)</p>

<p>そして、<code>config</code> において <code>sizefmt</code> 属性を使用することで、
返されるファイルサイズの書式を設定することができます。
バイト数には <code>bytes</code> を、適当に Kb や Mb に
短縮させるには <code>abbrev</code> を指定することができます。</p>

<hr>
<h2><a name="executingcommands">コマンドの実行</a></h2>

<p>今後数ヶ月の内に、小さな CGI プログラムと SSI を使用する
記事を出したいと考えています。ここではそれとは別に、
<code>exec</code> 要素によって行なうことができることを示します。
SSI にシェル (正確には <code>/bin/sh</code>。Win32 ならば DOS シェル)
を使用してコマンドを実行させることができます。下記の例では、ディレクトリ
リスト出力を行ないます。</p>

<pre>
        &lt;pre&gt;
        &lt;!--#exec cmd="ls" --&gt;
        &lt;/pre&gt;
</pre>

<p>Windows 上では、</p>

<pre>
        &lt;pre&gt;
        &lt;!--#exec cmd="dir" --&gt;
        &lt;/pre&gt;
</pre>

<p>Windows 上では、このディレクティブによっていくつかの奇妙な
書式に気づくでしょう。なぜなら <code>dir</code> の出力が
文字列 ``&lt;<code>dir</code>&gt;'' を含み、ブラウザを混乱させるからです。</P>

<p>この機能は非常に危険であり、どんなコードでも <code>exec</code> タグに
埋め込まれてしまえば実行することに注意してください。例えば 
`` ゲストブック '' のように、もし、ユーザがページの内容を
編集できる状況にあるならば、この機能を確実に抑制してください。
<code>Options</code> ディレクティブの <code>IncludesNOEXEC</code> 引数を指定することで、
SSI は許可するけれど <code>exec</code> 機能は許可しないようにすることができます。</p>

<hr>
<h2><a name="advancedssitechniques">高度な SSI テクニック</a></h2>

<p>コンテンツを出力することに加え、Apache SSI は変数を設定し、そして比較
と条件分岐にその変数を使用できる機能を提供しています。</p>

<h3><a name="caveat">警告</a></h3>

<p>この記事で述べた大部分の機能は、Apache 1.2 以降を
使用している場合のみ利用可能です。もちろん、もし Apache 1.2 以降を
使用してない場合、直ちにアップグレードする必要があります。
さぁ、今それを行ないなさい。それまで待っています。</p>

<hr>
<h2><a name="settingvariables">変数を設定する</a></h2>

<p><code>set</code> ディレクティブを使用して、後で使用するために変数を
設定することができます。これは後の説明で必要になるので、ここで
それについて述べています。文法は以下のとおりです:</p>

<pre>
        &lt;!--#set var="name" value="Rich" --&gt;
</pre>

<p>このように単純に文字どおりに設定することに加え、
例えば環境変数や前の記事で述べた変数 (例えば <code
>LAST_MODIFIED</code> のような) を含む他のあらゆる変数を
値を設定するのに使用することが
できます。変数名の前にドル記号 ($) を使用することで、
それがリテラル文字列ではなくて変数であることを示します。</p>

<pre>
        &lt;!--#set var="modified" value="$LAST_MODIFIED" --&gt;
</pre>

<p>ドル記号 ($) を文字として変数の値に入れるには、バックスラッシュによって
ドル記号をエスケープする必要があります。</p>

<pre>
        &lt;!--#set var="cost" value="\$100" --&gt;
</pre>

<p>最後になりますが、長い文字列の中に変数を置きたい場合で、
変数名が他の文字とぶつかる可能性があり、それらの文字について
混乱してしまう場合、この混乱を取り除くため、変数名を中括弧で
囲むことができます (これについての良い例を示すのは難しいのですが、
おそらく分かっていただけるでしょう)。</P>

<pre>
        &lt;!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" --&gt;
</pre>

<hr>
<h2><a name="conditionalexpressions">条件式</a></h2>

<p>さて、変数を持っていて、それらの値を設定して比較することができるのですから、
条件を表すためにそれらを使用することができます。これにより SSI は
ある種の小さなプログラミング言語になっています。<code>mod_include</code> は
条件を表現するために <code>if</code>, <code>elif</code>, <code>else</code>,
<code>endif</code> 構造を提供しています。これによって、一つの実際のページから
複数の論理ページを効果的に生成することができます。</p>

<p>条件構造は以下のとおりです:</p>

<pre>
        &lt;!--#if expr="test_condition" --&gt;
        &lt;!--#elif expr="test_condition" --&gt;
        &lt;!--#else --&gt;
        &lt;!--#endif --&gt;
</pre>

<p><em>test_condition</em> はあらゆる種類の論理的比較をすることができます。
値を比較したり、その値が ``真'' かどうかを評価します (空でないなら
与えられた文字列は真です)。利用可能な比較演算子の全てのリストについては、
<code>mod_include</code> ドキュメンテーションを参照してください。
ここでは、この構造をどう使用するかの例をいくつか示します。</p>

<p>設定ファイルで次の行を記述します:</P>

<pre>
        BrowserMatchNoCase macintosh Mac
        BrowserMatchNoCase MSIE InternetExplorer
</pre>

<p>これはクライアントが Macintosh 上でインターネットエクスプローラが
動いている場合、環境変数 ``Mac'' と ``InternetExplorer'' を真と設定します。</P>

<p>次に、SSI が可能になったドキュメントで以下を行ないます:</p>

<pre>
        &lt;!--#if expr="${Mac} &amp;&amp; ${InternetExplorer}" --&gt;
        Apologetic text goes here
        &lt;!--#else --&gt;
        Cool JavaScript code goes here
        &lt;!--#endif --&gt;
</pre>

<p>Mac 上の IE に対して何か思うところがあるわけでありません。
他では実行できているいくつかの JavaScript を Mac 上の IE で
実行させるのに、先週数時間苦労したというだけのことです。
上の例はその暫定的な対処方法です。</p>

<p>他のどんな変数 (あなたが定義するもの、または普通の環境変数のいずれか) も、
条件文に使用することができます。Apache は <code>SetEnvIf</code> 
ディレクティブや他の関連ディレクティブ使用して環境変数を設定することが
できます。この機能により、CGI に頼ることなくかなり複雑な動的なことをさせる
ことができます。</p>

<hr>
<h2><a name="conclusion">終わりに</a></h2>

<p>SSI は確かに CGI や動的なウェブページを生成する他の技術に代わるもの
ではありません。しかし、
たくさんの余分な作業をせずに、少量の動的なコンテンツを加えるには
すぐれた方法です。</p>

</body>
</html>
