SSIとは

SSIとはServer Side Includeの略で、HTML文書の中にSSIのコードを埋め込むことで、動的にページを生成するシステムです。
ページのヘッダー部分やフッター部分を共通ファイル化させたり、ページの一部にプログラムなどを読み込んだりできます。
SSIは、それのみではあまり複雑な処理はできませんが、別の言語・コマンドと組み合わせることで、さまざまなことができるようになります。

たとえば次のように記述することで、サーバの lsコマンドを実行、表示することができます。

<!--#exec cmd="/bin/ls" -->

他にも、SSIを利用すると次のようなことも可能です。

  • ・ヘッダーやフッターを1つのファイルに共通化できる。
  • ・ファイルの更新日時やサイズなど、簡単なことであればSSIのみで表示することができる。
  • ・コマンドやプログラムをSSIから呼び出して、実行、表示することができる。

SSIを使用するには

SSIを使用するには、webサーバがSSIをサポートしていて、かつSSIの実行を許可する設定がされている必要があります。

SSIの使用を許可するには、httpd.confまたは.htaccessに許可する設定をする必要があります。

.shtmlをSSIファイルとして認識させる。

AddOutputFilter INCLUDES .shtml
または
AddType text/x-server-parsed-html .shtml

OptionsディレクティブにIncludesを追加します。

Options +Includes

.shtml のファイルだけでなく、拡張子が .html のファイルでも SSI を使用したいときは、AddType の行を次のようにしてください。
ただし、.html のファイルに対しても、サーバーで SSI 処理を行うので、サーバーに負荷がかかります。

AddType text/x-server-parsed-html .shtml .html

SSIのコマンド一覧

コマンドオプション
#includefileファイル名
virtualファイル名
#execcmd外部コマンド名
cgiCGIプログラム名
#configerrmsg文字列
timefmtフォーマット
sizefmtbytes
abbrev
#fsizefileファイル名
virtualファイル名
#flastmodfileファイル名
virtualファイル名
#echovarDOCUMENT_NAME
DOCUMENT_URL
DATE_LOCAL
DATE_GMT
LAST_MODIFIED
QUERY_STRING_UNESCAPED
#printenv
#setvar変数名
value変数値
#if
制御構文
expr条件文
#elif
制御構文
expr条件文
#else
制御構文
#endif
制御構文

ファイル読みこみ( #include )

<!--#include file="〜" -->
<!--#include virtual="〜" -->

指定したファイルの中身を読込んで表示します。

fileは、『SSIコードの書かれたファイルからの相対パス』
virtualは、「 / 」から始めると読み込むファイルのURI、それ以外は相対パスを指定します。

URIとは
http://www.example.com/parts/header.html
だったとすると
/parts/header.html
の部分です。

これによりヘッダーやフッターを共通化させたり、部分的に動的なプログラムを読み込むことができます。


index.shtml (SSIファイル)

<html>
<head>
<title>サンプル</title>
</head>
<body>
<!--#include virtual="/header.html" -->
本文
<!--#include virtual="/footer.html" -->
</body>
</html>

header.html

<h1><a href="/">タイトル</a></h1>
<hr />

footer.html

<hr />
<address>Copyright (C) ほげほげ</address>

このようにすると

<html>
<head>
<title>サンプル</title>
</head>
<body>
<h1><a href="/">タイトル</a></h1>
<hr />
本文
<hr />
<address>Copyright (C) ほげほげ</address>
</body>
</html>

と出力されます。

CGIやPHPなどを読み込むこともできますが、このときは読み込むSSIに渡されている GETクエリなどは継承されません。
#includeでGETクエリを渡すには、

<!--#include virtual="hoge.cgi?a=test" -->

のように書く必要があります。

GETクエリなどを継承するには、次の#execを使います。

コマンド実行( #exec )

<!--#exec cmd="〜" -->
<!--#exec cgi="〜" -->

指定したコマンドやCGIを実行し、その結果を表示します。

<!--#exec cmd="/bin/ls" -->
<!--#exec cgi="./cgi-bin/hoge.cgi" -->

cmdでは、サーバのコマンドラインと同様に指定します。
引数(arg1、arg2、...)を指定するときには、コマンドラインで

/bin/xxx arg1 arg2

と入力するように

cmd="/bin/xxx arg1 arg2"

のように指定します。

CGIを呼び出すときには、SSIを使わず表示させる通常のCGIと同様に

Content-type: text/html

などのレスポンスヘッダを出力する必要があります。

GETクエリを指定するときには

<!--#exec cgi="hoge.cgi?a=test" -->

のようにSSIファイルに直接指定はできません。

<!--#exec cgi="hoge.cgi" -->

のようにして
http://www.example.com/foo.shtml?a=test
でアクセスされたときの a=test を hoge.cgi で受け取ることができます。

ファイルサイズ( #fsize )

<!--#fsize file="〜" -->
<!--#fsize virtual="〜" -->

指定したファイルのサイズを表示します。
表示のフォーマットは <!--#config sizefmt="..." --> で指定できます。

ファイルサイズ表示形式( #config sizefmt )

<!--#config sizefmt="〜" -->

#fsizeコマンドなどで表示されるファイルサイズのフォーマットを指定します。
bytes を指定するとバイト単位
abbrev を指定すると バイト、Kバイト、Mバイトなどの適切な単位で表示されるようになります。

<!--#config sizefmt="bytes" -->
<!--#fsize file="test.zip" -->

3,843
<!--#config sizefmt="abbrev" -->
<!--#fsize file="test.zip" -->

3.8K

最終更新時刻( #flastmod )

<!--#flastmod file="〜" -->
<!--#flastmod virtual="〜" -->

指定したファイルの最終更新時刻を表示します。
表示のフォーマットは <!--#config timefmt="..." --> で指定できます。

<!--#config timefmt="%c" -->
<!--#flastmod file="test.shtml" -->

08/27/09 12:43:54

時刻表示形式( #config timefmt )

<!--#config timefmt="〜" -->

#echoコマンドなどで時刻を表示する際のフォーマットを指定します。
〜 には %Y/%m/%d %H:%M:%s などの文字列を指定します。
%Y や %m は次のような意味を持ちます。

置換文字表示例意味
%c08/27/09 12:43:54月/日/年 時:分:秒
%x08/27/09月/日/年
%X12:43:54時:分:秒
%y09年(2桁)
%Y2009年(4桁)
%bOct月(3文字)
%BOctober月(フルスペル)
%m08月(2桁)
%aSat曜日(3文字)
%ASaturday曜日(フルスペル)
%d30日(2桁)
%j2231月1日からの日数
%w6日曜日からの日数
%pPMAMもしくはPM
%H23時(24時間制)
%I11時(12時間制)
%M44
%S56
%ZJSTタイムゾーン

環境変数表示( #echo )

<!--#echo var="〜" -->

指定した環境変数の値を表示します。〜 には LAST_MODIFIED などの環境変数名を指定します。
環境変数名には次のようようなものがあります。

環境変数意味
DOCUMENT_NAMEアクセスされたファイル名(ssi.html)
DOCUMENT_URIアクセスされたURI(/ssi/ssi.html)
QUERY_STRINGGETクエリ
QUERY_STRING_UNESCAPEDエスケープしていないGETクエリ
いくつかの記号文字(UNIXのシェルのメタ文字)はパックスラッシュ( \ )でエスケープされている
DATE_LOCAL現在の時刻(ローカル時刻)
DATE_GMT現在の時刻(グリニッジ標準時)
LAST_MODIFIEDこの文書の最終更新時刻
SERVER_ADDRサーバーのIPアドレス
REMOTE_ADDRアクセス元(閲覧者)のIPアドレス

時間の表示は <!--#config timefmt="..." --> で指定したフォーマットに従います。

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

環境変数表示( #printenv )

<!--#printenv -->

使用可能な環境変数の一覧を表示します。

<!--#printenv -->

HTTP_ACCEPT=*/*
HTTP_ACCEPT_LANGUAGE=ja
HTTP_ACCEPT_ENCODING=gzip, deflate
HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
HTTP_HOST=www.example.com
HTTP_CONNECTION=Keep-Alive
SERVER_SIGNATURE=
SERVER_SOFTWARE=Apache/2.2.11
SERVER_NAME=www.example.com
SERVER_ADDR=127.0.0.1
SERVER_PORT=80
REMOTE_ADDR=127.0.0.1
DOCUMENT_ROOT=/home/hoge/public_html
SERVER_ADMIN=webmaster@example.com
SCRIPT_FILENAME=/home/hoge/public_html/ssi/hoge.shtml
REMOTE_PORT=2956
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
QUERY_STRING=test=123&hoge=456
REQUEST_URI=/ssi/hoge.shtml?test=123&hoge=456
SCRIPT_NAME=/ssi/hoge.shtml
DATE_LOCAL=Sunday, 27-Sep-2009 12:50:07 東京 (標準時)
DATE_GMT=Sunday, 27-Sep-2009 03:50:07 GMT
LAST_MODIFIED=Sunday, 27-Sep-2009 12:50:04 東京 (標準時)
DOCUMENT_URI=/ssi/hoge.shtml
USER_NAME=<unknown>
DOCUMENT_NAME=hoge.shtml
QUERY_STRING_UNESCAPED=test=123\&hoge=456
……
………

変数設定( #set )

<!--#set var="〜" value="〜" -->

変数 〜 に、値 〜 を代入します。

<!--#set var="msg" value="Hello" -->
<!--#echo var="msg" -->

エラーメッセージ( #config errmsg )

<!--#config errmsg="〜" -->

文書処理中にエラーが発生した場合のエラーメッセージを指定します。

指定をしないと次のようなエラーが表示されます。

[an error occurred while processing this directive]

制御構文( #if, #elif, #else, #endif )

<!--#if expr="〜" -->
<!--#elif expr="〜" -->
<!--#else -->
<!--#endif -->

条件によって表示する内容を制御します。

条件演算子意味
=等しい
!=等しくない
<小さい
<=等しいか小さい
>大きい
>=等しいか大きい
!否定
&&かつ
||または

/.../ の形式を用いた場合は、正規表現によるマッチングを使用できます。

<!--#if expr="$HTTP_ACCEPT_LANGUAGE = ja" -->
こんにちは
<!--#else -->
Hello
<!--#endif -->
<!--#if expr="$HTTP_USER_AGENT = /compatible; MSIE/" -->
Internet Explorer で閲覧中です
<!--#endif -->
<!--#if expr="($a = 10) && ($b = 20)" -->
こんにちは
<!--#endif -->

スポンサーリンク

関連記事

スポンサーリンク

ROLLBACK トランザクションをする前に戻す

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る