SSI
SSI とは
SSI は Server Side Includes の略であり、HTMLファイルの中に組み込みコマンドを書くことによって、サーバ側でコマンドを実行し、結果をその場所に挿入してからクライアントに送信する技術のことです。即ち、サーバは常にHTML ファイルを開いて SSIの命令があるかどうかを確認し、命令があればコマンドの結果を挿入してレスポンスを返す、という作業をリクエストがあるごとに行います。それに加え、SSIが使われていますページは、動的にページを作成するというSSIの性質上、プロキシサーバやクライアントにキャッシュされません。これらのことから、Webサーバにかかる負荷は当然増えることになります。拡張子が「shtml」のファイルにのみ処理を適用することによって多少は負荷が軽減されますが、負荷がかかることに違いはないのです。常に機能とサーバの負荷を天秤にかけ、本当にSSIを使用する必要があるのかどうかを判断する必要があります。あまりにも負荷がかかるようでしたら代替方法を検討した方がよいでしょう。
またSSIが使用可能ということは、任意のユーザから悪意のあるコマンドを実行される恐れが出てきます。特に、パーミッションの設定には気を配る必要があるでしょう。SSIを読み出すファイルのパーミッションが「777」などもってのほかとして、「755」でも不安が残ります。大抵の場合、Webサイトの管理者はユーザですし、閲覧者はその他ユーザです。ということは、グループユーザに対して何らかの権限を与える必要は必ずしもないわけです。他人に対してSSIが記述されているソースを見せるという事は、思わぬ結果をもたらすかもしれません。問題ないのであればパーミッションを「705」に設定し、SSIを使用することによる危険意識は常に持っておかなければなりません。
SSIの問題点ばかり先行してしまいましたが、当然優れた面もあります。特に難しいプログラムを記述しなくても、簡単に動的なページを作成することができます。全てのページに同じヘッダとフッダをつけたり、そのページの最終更新日を表示したり、アクセスカウンタを作ることもできます。繰り返しますが、これらのことを簡単に実現できるのです。パフォーマンスとセキュリティを十分に考慮にいれた上で、適材適所の選択肢としてSSIを覚えておくのもいいかもしれません。
SSI を使用するにあたって
「SSIとは」を読んでもらったらわかると思いますが、SSIを嫌うサーバ管理者が多いのは当然のことです。SSIを使用するには、WebサーバがSSIをサポートされていて、尚且つSSIの使用を許可されてなければなりません。一般のISPではセキュリティとパフォーマンスの関係上許可していないことが多いので、まずは自分が使用していますWebサーバの設定を確認してみて下さい。また、SSIをサポートしているWebサーバであっても、拡張子を「shtml」にしなければならない、SSIを設置できるディレクトリが決められている、自分で設定ファイル(.htaccess)を編集しなければならないなどとサーバによって様々です。詳細は管理者のほうに確認してください。
念のため、「Apatch」サーバの設定方法を既述しておきます。まずは、SSIを含めたHTMLファイルを置くディレクトリに、「.htaccess」という名前のファイルを作ります。「.htaccess」による設定は、「.htaccess」以下のディレクトリでも有効になりますので、ドキュメントのルートになど、適当な場所に設置してください。次に、「.htaccess」の中身を以下のように編集してください。
AddType text/x-server-parsed-html .html
Options FollowSymLinks Indexes Includes
一行目は、拡張子が「html」のファイルがSSIを実行することができることを示しています。二行目は、そのディレクトリ以下で有効になる設定を示しており、複数の設定を一度に記述することができます。
- FollowSymLinks:シンボリックを追随する
- Indexes:ディレクトリのファイル一覧のリクエストを許可する
- Includes:このディレクトリ内のSSIファイルを許可する
もうわかると思いますが、拡張子が「shtml」のものだけにSSIの実行を許可するのであれば、一行目末尾の「html」を「shtml」に変えれば良いのです。
ただし、閲覧者からこの設定ファイルを覗かれるのを防ぐために、「.htaccess」といファイル名は、サーバ側の設定により変更することができます。そのため、管理者の設定によっては、別名でこの設定ファイルを作らなければならないかもしれませんので注意が必要です。
SSIの指定は、HTMLでの注釈の中に埋め込まれ、書式は以下のようになります。
<!--#command tag="value" -->
config
出力形式を指定します。
errmsg="…"
SSIの実行中にエラーが起こった場合に、ここで指定した文字列が出力されます。
<!--#config errmsg="SSI Error"-->
sizefmt="…"
ファイルサイズの出力形式を指定します。
- bytes:バイト単位でファイルサイズを出力します。
- abbrev:KBまたはMB単位でファイルサイズを出力します。【初期値】
<!--#config sizefmt="abbrev" -->
<a href="key.mp3">Dll</a>(<!--#fsize file="key.mp3" -->)
timefmt="…"
日付・時刻の出力形式を指定します。
- %c:現在日時を表します。
- %x:現在の日付を表します。
- %X:現在の時刻を表します。
- %D:現在の日付を、月/日/年で表します。
- %T:現在の時刻を、時:分:秒で表します。
- %r:現在の時刻を、時:分:秒 AM/PMで表します。
- %R:現在の時刻を、時:分で表します。
- %y:年を2桁で表します(00〜99)。
- %Y:年を4桁で表します。
- %D:年の上2桁を表します。
- %b:月を省略形で表します。
- %B:月を英フルスペルで表します。
- %m:月を数字で表します。
- %U:今年に入って第何週目かを表します。(最初の日曜日起点)
- %W:今年に入って第何週目かを表します。(最初の月曜日起点)
- %a:曜日を省略形で表します。
- %A:曜日を英フルスペルで現します。
- %d:日付を表します。
- %e:日付を表しますが、1桁の時はスペースで埋めます。
- %j:1月1日から何日経過したかを表します。(1/1 = 1)
- %w:日曜日を0として曜日を表します
- %p:AM/PMを表します。
- %H:時間を24時間制で表します。
- %I:時間を12時間制で表します。
- %k:時間を24時間制で表します。(1桁の時はスペースで埋める)
- %l:時間を12時間制で表します。(1桁の時はスペースで埋める)
- %M:分を表します。
- %S:秒を表します。
- %Z:現在の地域名を表します。
<!--#config timefmt="%A, %y/%m/%d %H:%M" -->
<!--#flastmod file="ssi.html" -->
echo
様々な環境変数の値を表示します。
- DOCUMENT_NAME:自分のファイル名
- DOCUMENT_URI:ドキュメントルートを頂点とする絶対パス
- QUERY_STRING_UNESCAPED:クライアントの送ってきた全てのqueryデータ
- DATE_LOCAL:ローカルゾーンでの現在時刻
- DATE_GMT:グリニッジ標準時での現在時刻
- LAST_MODIFIED:自分自身の最終更新時間
最終更新日:<!--#echo var="LAST_MODIFIED" -->
exec
UNIXシェルコマンドまたはサーバ上にある任意のプログラムを実行させるのに使います。通常、プログラムを実行して標準出力に返す値を表示させる目的で使用します。
- cmd:与えられた文字列を /bin/sh を用いて実行します
- cgi:ドキュメントルートを頂点とする絶対パスで指定したCGIプログラムを実行します
<!--#exec cmd="/bin/date" -->
<!--#exec cmd="echo count01.dat">
<!--#exec cmd="/bin/ls" -->
<!--#exec cgi="./cgi-bin/ssi.cgi" -->
flastmod
指定したファイルの最終更新時間を表示します。
file="ファイル名(相対パス)"
取り込んで表示するファイルをカレントディレクトリを起点に、同じディレクトリか下のディレクトリにあるファイルに対して指定できます。つまり、「./
」や「../
」といった指定はできません。
virtual="ファイル名(URL指定)"
ファイルを仮想パス名にて指定できます。仮想パス名とは、「http://サーバー名/パス名
」の「/パス名」の部分となります。
最終更新日:<!--#flastmod file="me.html" -->
fsize
指定したファイルのファイルサイズを表示します。ファイルの指定の仕方は、「flastmod」と同じです。
include
指定したファイルの中身を読込んで表示します。ファイルの指定の仕方は、「flastmod」と同じです。
他にも、
<!--#if expr="$HTTP_ACCEPT_LANGUAGE = ja" -->
はろー!!
<!--#else -->
Hello!!
<!--#endif -->
みたいな使い方ができたり、正規表現が使えたりもします。