サーバサイドインクルード(SSI)について

-- 簡単なカウンタプログラム --


サーバサイドインクルード(Server Side Include:SSI)という機能を利用すると 簡単なものは、CGIを使わなくてもいろいろなことができるようになる。もっとも、 実行はサーバ側なのでアクセスが集中したりするとサーバ側の負担が大きくなるの で注意が必要である。

SSIでできることは、

  1.  HTMLの中に別のHTML(ファイル)を含めることができる。
  2.  HTMLに日付や時刻などを挿入できる。
  3.  ファイルの容量や最終更新日などを自動的に取り込める。
  4.  CGI スクリプトの出力や、コマンド、シェルなどの出力を取り込める。

などである。本来は、SSIを実行させるためには、サーバ側での設定が必要となるが、 本学では、WWWページのあるディレクトリ上に .shtml という拡張子をつけて保存す れば、サーバはSSI ファイルとみなすようになっている。

1 簡単な例(日時の表示)

実際に例を見ながら説明しよう。今、testssi.shtml というファイルの内容を以下の ようにする。

	<!--#config timefmt="%m/%d/%y"-->
	<!--#echo var="DATE_LOCAL"-->
これを見ると <!-- と--> で囲まれているので、コメント行のように思えるが、 これがSSIの命令になっている。コメントで囲まれているのは、サーバ側にSSIの機能 がない場合は、コメントとして扱うためである。(SSI機能が設定されている場合には、 コメントではなくSSIとして機能する)

さて、上の例では何を行っているかといえば、 #config という命令で、出力形式を 指定する。この場合は時間の出力(timefmt)に対して %m/%d/%y すなわち、 月 / 日 / 年の形式で、現在日時を表示させるようにしている。この例では、 たとえば

06/09/98

というように表示される。では、98年06月09日というように表示させるためには以下 のようにする。

	<!--#config timefmt="%y年%m月%d日"-->
	<!--#echo var="DATE_LOCAL"-->

%y,%m,%d のほかに以下のようなフォーマット指定がある。

%B	月名を英語で表示する          例) January 
%b	月名を英語の省略形で表示する      例) Jan
%a	曜日を省略形で表示する         例) Mon 
%A	曜日を英語で表示する          例) Monday
%Y	西暦年を省略しないで表示する      例) 1998
%H	現在時刻の時を24時間表示で示す	
%I	時刻の時を12時間表示で示す
%M	現在時刻の分を表示する
%S	現在時刻の秒を表示する
%P	a.m.やp.m.を表示する
%X	省略形の時刻              例)10:20:35

さて、上の例では <!--#echo var="DATE_LOCAL"--> としてvar にDATE_LOCAL を指定してその内容を表示(#echo)しているわけだが、DATE_LOCAL 以外にはどの ようなものがあるだろうか?

DOCUMENT_URL	:このファイルのURLを表示する
DOCUMENT_NAME	:ファイル名を表示する
DATE_GMT		:世界標準時による日時の表示
LAST_MODIFIED	:ファイルの最終更新日

例)

最終更新日:<!--#echo var="LAST_MODIFIED--> 最終更新日:06/09/98

2 ファイルの取り込み

同じ内容を複数のHTMLに取り込む場合には、SSIでファイルを取り込んでおけば、 あとで修正するときにすべてのファイルに対して修正をほどこさなくても、 取り込んだファイルだけを修正すればすむ。

例)	<!--#include file="xxx.html"-->
このように記述すれば、xxx.html の内容を取り込むことができる。この場合は これを記述したshtml ファイルとxxx.html が同じディレクトリにある必要がある。 もしサブディレクトリにある場合には相対パスを指定する。ただし、 全く別のディレクトリにある場合には、
	<!--#include virtual="/~uid/dir/xxx.html"-->
というようにvirtual でフルパスを指定する必要がある。取り込むファイルは 別のSSIファイルでもよい。

3 ファイルの属性表示

任意のファイルの容量や最終更新日を表示するためには以下のようにする。

	<!--#fsize file="xxx.html"-->
	<!--#flastmod file="xxx.html"-->
ファイルサイズは、デフォルトでは Kbyte単位で表示される。 これをbyte単位で表示したい時は、
	<!--#config sizefmt="bytes"-->
を指定する。逆にbyte 単位に設定したあとに再びKbyte単位に戻す場合には、
	<!--#config sizefmt="abbrev"-->
を指定する。また、修正日の日時の表示に対しても前述の <!--#config timefmt=" "--> による指定も有効となる。

4 スクリプトの出力を取り入れる。

 コマンドやスクリプト(B-shell)などの出力を取り込める。  <!--#exec cmd="date"-->とか、あまり意味はないが、 <!--#exec cmd="ls -l"--> のようなことができる。また、自作のスクリプト xxx というものを実行するのも、

	<!--#exec cmd="xxx"-->
で行える。(ただしxxxはフルパスで指定する必要がある) あとで簡単なカウンタ 表示のためのシェルを説明する。

一方、呼び出すのがCGI の場合には、

	<!--#exec cgi="xxx.cgi"-->
ただし、この場合には一般には引き数をCGIに渡すことができない。

5 簡単なカウンタ表示

 以上説明したことで簡単なカウンタプログラムを作ることができる。 (より凝ったカウンタを作るためにはCGIが必要である)

例)testssi.shtml

<p>現在時刻:<!--#config timefmt="%y年%m月%d日 %Xです--> </p>
<!--#echo var="DATE_LOCAL"-->
<p>あなたは<!--#exec cmd="/www/f/fxxx/public_html/file_name"-->人目の訪問者です </p>
スクリプトはフルパスで指定する必要がある。/a/axxx/ のところは、各自のディレクトリ を指定する。

さて、シェルスクリプトの方であるが、以下のような内容で上で指定した file_nameのファイルを作る。もちろんアクセス権限は、chmod a+x file_name としてだれもが実行できるようにしておかなければならない。(read 権限も必要)

例)file_name であたえられたシェルの中味

#!/bin/sh

cntfile=/www/a/axxx/public_html/home_count

num=`cat $cntfile`
num=`expr $num + 1`

echo $num > /www/a/axxx/public_html/tmp/cntfile.$$
cp /www/a/axxx/public_html/tmp/cntfile.$$ $cntfile
rm /www/a/axxx/public_html/tmp/cntfile.$$

echo $num
これでOKであるが、何を行っているか簡単に説明する。
1行目:#!/bin/sh これがB-shellのスクリプトであることを示す。
2行目:ntfile という変数にファイルのフルパスを指定する。 /a/axxx/ には各自のディレクトリを指定する。
3行目:numという変数にcntfile に指定したファイル(ここでは home_count という名前のファイル)の中の値を代入する。
4行目:num の値を1つ増やす。
5行目:num の値をテンポラリファイル tmp/cntfile.$$ に出力する。
6行目:テンポラリファイルの中の値を変数 cntfile で指定したファイル(ここでは home_count )にコピーする。
7行目:num の値を表示する。
ここで注意しなければならないことは、ホームディレクトリの下に tmp (名前は何でもよい)というディレクトリを作っておいて、アクセス権限に chmod a+wx tmp というように指定する必要がある。  またカウンタの値は、home_count というファイルに入ることになるが、最初だけ ファイルを作成して初期値(0)をあらかじめ入力しておく必要がある。(できれば tmp というディレクトリは外から見えないようなところに置いておく方がよい。 というのは書き込み権限があたえられているので、誰でもがファイルを置けてしま うからである)

出力例)


	現在時刻:98年06月09日10:20:35 です

	あなたは1998人目の訪問者です 

参考文献 ローラ・リメイ著 武舎広幸、久野禎子、久野靖訳
     「続・HTML入門」 プレンティスホール出版 1995 東京
松本 紳 (amy@ulis.ac.jp)
1998.07.10