SSI (Server Side Includes) の書き方

公開日:
更新日:
0.htaccess

SSI (Server Side Includes) とは

SSI (Server Side Includes) とは、HTML ページの中に Web サーバ側で実行するコマンドを埋め込んでおき、その実行結果をクライアントに返す仕組みです。例えば、以下の例ではファイルの最終更新日時を返すコマンドを埋め込んでいる例です。


<html>
  <head>
    <title>Sample SSI</title>
  </head>
  <body>

    このファイルは
    <!--#echo var="LAST_MODIFIED" -->
    に更新されました。

  </body>
</html>
 SSI でファイルの最終更新日時を返す例 (sample.shtml)
# 実行結果
このファイルは Monday, 31-Aug-2015 10:39:30 JST に更新されました。
 SSI でファイルの最終更新日時を返す例 (sample.shtml)

ただし、通常の HTML ファイルに上記のコードを埋め込んでも何も表示されません。SSI を有効にするには、事前設定が必要になります。

SSI を使用するための設定

SSI を使用するには、サーバが SSI がサポートしており、かつ SSI の実行を許可する設定が行われている場合に限られます。そのため、一部のプロバイダでは利用できない場合があります。また、SSI が利用可能でも、"拡張子が .shtml に固定されている"、"SSI を実行できるディレクトリが決まっている"、".htaccess の設定が必要" などの制約がある場合があります。詳細は、利用しているプロバイダや、レンタルサーバの公式ページを確認するか、問い合わせて下さい。


SSI は、INCLUDES フィルタ により実装されています。そのため、サーバで SSI を許可するには httpd.conf、または .htaccess に Options ディレクティブに Includes を指定します。 さくらインターネットの場合は、Options ディレクティブの設定はできませんが、ファイルの拡張子を .shtml にするだけで SSI を使用可能です。 以下は、Options ディレクティブに Includes を指定して SSI を有効にする設定例です。


# INCLUDES フィルタを有効にする
Options +Includes
 INCLUDES フィルタを有効にする例

上記の設定により、Apache にファイルの SSI ディレクティブを解析させることを許可しています。解析を行うファイルを指定するには AddOutputFilter ディレクティブ、または XBitHack ディレクティブで指定します。

AddOutputFilter ディレクティブ

AddOutputFilter ディレクティブを使用する場合、どの拡張子に対して SSI ディレクティブの解析するかを指定します。下記の例では、拡張子 .shtml に対して SSI ディレクティブの解析するよう Apache に伝えています。


# AddOutputFilter ディレクティブで SSI を有効にする例
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
 AddOutputFilter ディレクティブで SSI を有効にする例

ただし、上記の例では既存のページに SSI ディレクティブを追加したい場合、拡張子を変更しなければならない欠点があります。その場合、そのページの拡張子と、そのページへのすべてのリンクを変更しなければなりません。もしも拡張子に .html を指定した場合は、それらの問題は回避できますが、後述するパフォーマンスの問題が発生します。


AddOutputFilter ディレクティブの詳細は、.htaccessの書き方を参照して下さい。

XBitHack ディレクティブ

XBitHack ディレクティブを使用する場合、ファイルの実行ビットが立っている場合に SSI ディレクティブを解析することを Apache に伝えます。実行ビットとは、ファイルのパーミッションにおける実行フラグ ("x" で表される) のことを指します。そのため、XBitHack ディレクティブを利用する方法では、既存のページに SSI ディレクティブを追加したい場合、拡張子の変更が不要になります。ファイルの実行ビットを立てるには FTPソフトウェアや、コンソール上から chmod コマンドを使用してファイルを実行可能に変更します。


さくらインターネットのレンタルサーバでテストした結果、"500 internal server error" が発生し、エラーログには "XBitHack not allowed here" と記録されているため、AllowOverride ディレクティブで許可されていないようです。そのため、拡張子を .shtml に変更して SSI を利用する必要があります。拡張子が .html でも SSI を利用できることは確認していますが、後述するパフォーマンスの問題を確認して下さい。


# XBitHack ディレクティブで SSI を有効にする例
XBitHack on
 XBitHack ディレクティブで SSI を有効にする例
# 実行ビット (x) が付与されていない
% ls -l sample.shtml
-rw-r-xr--  1 murashun  users  85 Aug 31 10:39 sample.shtml

# chmod コマンドで実行ビットを立てる例
% chmod +x sample.shtml

# 実行ビット (x) が付与された
% ls -l sample.shtml
-rwxr-xr-x  1 murashun  users  85 Aug 31 10:39 sample.shtml
 chmod コマンドで実行ビットを立てる例

上記の例では、サーバに SSH でログインし、コンソール上からパーミッションを変更している例となります。chmod コマンドにより、実行ビット ("x") を追加しています。実行ビットを追加後に ls -l コマンドで対象ファイルのパーミッションを確認すると、実行ビットが付与されていることが確認できます。


XBitHack ディレクティブの詳細は、.htaccessの書き方を参照して下さい。

SSI ディレクティブ

SSI を使用するための設定が完了したら、対象ファイルに SSI ディレクティブ(命令) を埋め込むことができます。SSI は、特別なコマンドが埋め込まれた HTML ドキュメントとしてパース (構文解析) されます。コマンドには、HTML のように element (要素) 、attribute (属性)、value (属性値) を持ちます。コマンドの構文は以下の通りです。


<!-- SSI のコマンド構文 -->
<!--#element attribute=value [attribute=value] ... -->
 SSI のコマンド構文

value" で囲むのが一般的ですが、'` も使用できます。また、最初の <!--# はまとめて 1 つの句として解釈されるため、スペースを入れないように注意して下さい。ただし、最後の --> の前には、逆にスペースを入れる必要があるため、こちらも注意が必要です。SSI のコマンドで使用可能な要素と属性は下表の通りです。

SSI の要素一覧
要素説明
configSSI コマンドのエラーメッセージや、日付フォーマット、ファイルサイズフォーマットを設定を定義できます。
echo指定した変数、または環境変数を表示します。未定義の場合は、(none) と表示されます。このエラーメッセージは config 要素の echomsg 属性や、SSIUndefinedEcho ディレクティブで変更可能です。
exec指定したコマンドや CGI スクリプトを実行し、その結果を表示します。さくらインターネットのレンタルサーバで CGI スクリプトを実行する場合は、同じディレクトリにファイルを配置する必要があります。また、その他にも注意事項・制限事項があるため、公式ヘルプを参照して下さい。
fsize指定したファイルのサイズを表示します。
ファイルサイズのフォーマットは、config 要素の sizefmt 属性で変更可能です。
flastmod指定したファイルの最終更新時刻を表示します。
日付のフォーマットは config 要素の timefmt 属性で変更可能です。
include指定したファイルの中身を読込んで表示します。
printenv使用可能な環境変数の一覧を表示します。Apache 1.2 以降で使用可能です。
set任意の変数に値を代入できます。Apache 1.2 以降で使用可能です。
SSI の要素・属性一覧
要素属性説明
configechomsgecho 要素が未定義の変数をエコーしようとした際に、表示されるメッセージを定義します。指定した場合は、SSIUndefinedEcho ディレクティブを上書きします。本属性は、Apache 2.1 以降で使用可能です。
errmsgドキュメントの解析中にエラーが発生した場合、表示されるメッセージを定義します。指定した場合は、SSIErrorMsg ディレクティブを上書きします。
sizefmtfsize 要素で表示されるファイルサイズのフォーマットを指定します。
bytes を属性値に指定するとバイト単位で表示されます。(単位は表示されず整数表示となります。)abbrev※1 を属性値に指定すると単位が "K" (KByte) や "M" (MByte) で表示されます。
timefmt時刻を表示する際のフォーマットを定義します。%Y%M などの strftime 関数の変換指定子が使用できます。
echovar要素の表で説明したものと同様です。使用可能な環境変数は後述します。また、サーバによっては HTTP 環境変数の一部も使用可能です。さくらインターネットのレンタルサーバでは HTTP 環境変数の一部が使用可能です。
encoding変数を出力する前に、変数の中に含まれる特殊文字をどのようにエンコードするかを指定します。none はエンコードを行いません。url はパーセントエンコードを行います。entity は HTMLエンコードを行います。クロスサイトスクリプティングの脆弱性を回避するために、ユーザからのデータを受け取る場合は常にエンコードを行って下さい。
execcgi指定した CGI スクリプトを実行し、その結果を表示します。
cmd指定したコマンドを実行し、その結果を表示します。
fsizefileドキュメントが存在するディレクトリからの相対パスでファイル名を指定します。ただし、../ を含むパス や 絶対パスは使用できません。上位ディレクトリのファイルを指定する場合は、virtual を使用します。
virtualホスト名からの相対パスでファイル名を指定します。パスが / から始まらない場合は、ドキュメントが存在するディレクトリからの相対パスとして扱われます。
flastmodfilefsize 要素の file 属性と同様です。
virtualfsize 要素の virtual 属性と同様です。
includefilefsize 要素の file 属性と同様です。
virtualfsize 要素の virtual 属性と同様です。
printenv要素の表で説明したものと同様です。
setvar変数の名前を設定できます。
value変数に代入する値を設定できます。

config - echomsg

echo 要素が未定義の変数をエコーしようとした際に、表示されるメッセージを定義します。下記の例では、echomsg に "変数は宣言されていません" という文字列を設定して、定義済みの変数 (msg) と未定義の変数 (hoge) を echo した結果を表示しています。


<!--#config echomsg="変数は宣言されていません" -->
<!--#set var="msg" value="Hello, world!" -->

<!--#echo var="hoge" --><br>
<!--#echo var="msg" -->
 config 要素 echomsg 属性の設定例
変数は宣言されていません
Hello, world!
 実行結果

config - errmsg

ドキュメントの解析中にエラーが発生した場合、表示されるメッセージを定義します。下記の例では、echomsg に "エラーが発生しました" という文字列を設定して、SSI ディレクティブには存在しない #hoge を実行した結果を表示しています。


<!--#config errmsg="エラーが発生しました" -->
<!--#hoge var="msg" value="Hello, world!" -->
 config 要素 errmsg 属性の設定例
エラーが発生しました
 実行結果

config - sizefmt

fsize 要素で表示されるファイルサイズのフォーマットを指定します。 "bytes" を属性値に指定するとバイト単位で表示されます。 (単位は表示されず整数表示となります。) "abbrev" を属性値に指定すると単位が "K" (KByte) や "M" (MByte) で表示されます。下記の例では、"sample1.html" のファイルサイズが 314 Byte、 "sample2.html" のファイルサイズが 2.1 MByte の html ファイルを用意して表示しています。


<!--#config sizefmt="bytes" -->
<!--#fsize file="sample1.html" --><br>
<!--#fsize file="sample2.html" --><br>
<br>
<!--#config sizefmt="abbrev" -->
<!--#fsize file="sample1.html" --><br>
<!--#fsize file="sample2.html" --><br>
 config 要素 errmsg 属性の設定例
314
2,186,087

314 
2.1M
 実行結果

上記の例では、abbrev を指定しても sample1.html は小数点表示にはならず、sample2.html は切り下げて表示されています。また、存在しないファイルを指定した場合、"[an error occurred while processing this directive]" と表示されます。

config - timefmt

時刻を表示する際のフォーマットを定義します。 %Y や %M などの strftime 関数の変換指定子が使用できます。使用できる変換指定子は以下の通りです。

timefmt で使用可能な変換指定子一覧
変換指定子表示例説明
%aMon曜日 (英字3文字)
%AMonday曜日 (英字)
%bSep月 (英字3文字)
%BSeptember月 (英字)
%cMon Sep 14 19:41:01 2015曜日 (英字3文字) 月 (英字3文字) 日 時:分:秒 年
%C20年 (上2桁)
%d14日 (先頭に0を含む2桁表示)
%D09/14/15月/日/年 (下2桁)
%E別形式を使用する際の修飾子。
%F2015-09-14年-月-日
%g15年 (ISO 週番号 (%V) に対応する年の下2桁表示)
%G2015年 (ISO 週番号 (%V) に対応する年の4桁表示)
%hSep%b と同じです。
%H19時。00 ~ 23 (24時間表示)
%I07時。00 ~ 12 (12時間表示)
%j2571 月 1 日からの日数。001 ~ 366 (先頭に0を含む3桁表示)
%k19時。0 ~ 23 (24時間表示。1桁の場合は先頭にスペースを置く)
%l7時。0 ~ 12 (12時間表示。1桁の場合は先頭にスペースを置く)
%m09
%M41
%n改行 (br要素ではなく改行コードが入る)
%O別形式を使用する際の修飾子。
%pPMAM または PM
%Ppmam または pm
%r19:41:01 PM午前・午後形式での時刻。%I:%M:%S %p と同じ。
%R19:4124時間表示での時:分。%H:%M と同じ。
%s14422311341970-01-01 00:00:00 +0000 (UTC) からの秒数。
%S01
%T19:41:0124時間表示の時:分:秒。%H:%M:%S と同じ。
%u11 (月曜) ~ 7 (日曜)
%U37週番号。00 ~ 53 (最初の日曜日を第一週目の開始日とする)
%V38週番号。01 ~ 53 (最初の週が4日以上あれば1として計算する)
%w10 (月曜) ~ 6 (日曜)
%W37週番号。00 ~ 53 (最初の月曜日を第一週目の開始日とする)
%x09/14/15月/日/年 (下2桁)
%X19:41:01時:分:秒
%y15年 (下2桁)
%Y2015
%ZJSTタイムゾーン
%z+0900+hhmm や -hhmm の形式のタイムゾーン。
(UTC へのオフセット時間)
%+Mon Sep 14 19:41:01
JST 2015
曜日 (英字3文字) 月 (英字3文字) 日 時:分:秒 タイムゾーン 年

<!--#config timefmt="%Y/%m/%d" -->
<!--#echo var="DATE_LOCAL" --><br>
<!--#flastmod  file="example.shtml" -->
 config 要素 timefmt 属性の設定例
2015/09/14
2015/09/14
 実行結果

上記の例では、年・月・日を / を区切ったフォーマットを表示しています。"DATE_LOCAL" は現在日時を表し、"flastmod" は "example.shtml" の最終更新時刻を表します。

echo - var

指定した変数、または環境変数を表示します。 未定義の場合は、(none) と表示されます。また、サーバによっては HTTP 環境変数の一部も使用可能です。 さくらインターネットのレンタルサーバでは HTTP 環境変数の一部が使用可能です。使用可能な環境変数は以下の通りです。

echo 要素の var 属性で使用可能な環境変数一覧
環境変数名説明
DOCUMENT_NAME表示しているドキュメントのファイル名が含まれます。
DOCUMENT_URI表示しているドキュメントの URL が含まれます。
QUERY_STRING_UNESCAPEDGET クエリの文字列が含まれます。
Unix シェルのメタ文字は \ でエスケープされます。
DATE_LOCAL現在の時刻(ローカル時刻)が含まれます。
DATE_GMT現在の時刻(グリニッジ標準時)が含まれます。
LAST_MODIFIED表示しているドキュメントの最終更新日時が含まれます。

<!--#echo var="DOCUMENT_NAME" --><br>

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

<!--#echo var="hoge" -->
 echo 要素 var 属性の設定例
example.shtml
Hello, world!
(none)
 実行結果

echo - encoding

変数を出力する前に、変数の中に含まれる特殊文字をどのようにエンコードするかを指定します。"none" はエンコードを行いません。"url" はパーセントエンコードを行います。"entity" は HTMLエンコードを行います。Apache のデフォルトのエンコーディングは ISO-8859-1 (Latin-1) であるため、変数の中に日本語が含まれる場合、文字化けを起こします。 文字化けを回避するには、"none" を設定して下さい。また、クロスサイトスクリプティングの脆弱性を回避するために、ユーザからのデータを受け取る場合は常にエンコードを行って下さい。エンコーディングの設定を省略した場合は、"entity" がデフォルトで設定されます。


<!--#set var="msg" value="日本語が含まれる文字列です。" -->
<!--#echo var="msg" --><br>
<!--#echo var="msg" encoding="none" --><br>
<!--#echo encoding="none" var="msg" --><br>
 echo 要素 var 属性の設定例
(文字化けのため省略)
(文字化けのため省略)
日本語が含まれる文字列です。
 実行結果

上記のように、日本語が含まれる変数を echo した場合は文字化けを起こします。また、encoding="none" は var の前に設定しなければ効果がありません。ファイルを保存する場合の文字コードと、ブラウザの表示エンコードが一致しているかも確認して下さい。

exec - cgi

指定した CGI スクリプトを実行し、その結果を表示します。さくらインターネットのレンタルサーバで CGI スクリプトを実行する場合は、同じディレクトリにファイルを配置する必要があります。また、その他にも注意事項・制限事項があるため、公式ヘルプを参照して下さい。


<!--#exec cgi="example.cgi" -->
 exec 要素 cgi 属性の設定例

さくらインターネットの場合は、/cgi-bin ディレクトリ配下でしか CGI スクリプトが動作しないため、shtml も /cgi-bin ディレクトリ配下に配置する必要があります。もしも .pl ファイルを実行する場合は、cmd 属性を使用して下さい。

exec - cmd

指定したコマンドを実行し、その結果を表示します。設定された文字列は /bin/sh で実行されます。引数 (arg1, arg2 ...) を指定する場合は、スペースで区切って指定して下さい。Perl 側で引数を受け取るには @ARGV を参照して下さい。


<!-- 引数なしの場合 -->
<!--#exec cmd="/bin/ls" -->

<!-- 引数ありの場合 -->
<!--#exec cmd="/bin/ls arg1 arg2" -->

<!-- .pl を実行する場合 -->
<!--#exec cmd="example.pl" -->
 exec 要素 cmd 属性の設定例

ただし、サーバによってはコマンド名に絶対パスを指定できない、パス名で上位ディレクトリ (..) を参照できない、コマンドの引数を渡せない、コマンド実行時のカレントディレクトリが異なるなどの違いがあります。さくらインターネットの場合は、cmd の実行が許可されていないため、上記のコマンドは使えません。ただし、同ディレクトリにある .pl などのスクリプトファイルの実行は可能です。

fsize - file

指定したファイルのサイズを表示します。ファイルサイズのフォーマットは、config 要素の sizefmt 属性で変更可能です。ドキュメントが存在するディレクトリからの相対パスでファイル名を指定します。ただし、../ を含むパス や 絶対パスは使用できません。上位ディレクトリのファイルを指定する場合は、virtual を使用します。設定例については、config - sizefmt を参照して下さい。

fsize - virtual

指定したファイルのサイズを表示します。ファイルサイズのフォーマットは、config 要素の sizefmt 属性で変更可能です。ホスト名からの相対パスでファイル名を指定します。パスが / から始まらない場合は、ドキュメントが存在するディレクトリからの相対パスとして扱われます。設定例については、config - sizefmt を参照して下さい。

flastmod - file

指定したファイルの最終更新時刻を表示します。日付のフォーマットは config 要素の timefmt 属性で変更可能です。ドキュメントが存在するディレクトリからの相対パスでファイル名を指定します。ただし、../ を含むパス や 絶対パスは使用できません。上位ディレクトリのファイルを指定する場合は、virtual を使用します。日時のフォーマット指定については、config - timefmt を参照して下さい。


<!--#config timefmt="%Y/%m/%d" -->
<!--#flastmod  file="example.shtml" -->
 flastmod 要素 file 属性の設定例
2015/09/14
 実行結果

flastmod - virtual

指定したファイルの最終更新時刻を表示します。日付のフォーマットは config 要素の timefmt 属性で変更可能です。ホスト名からの相対パスでファイル名を指定します。パスが / から始まらない場合は、ドキュメントが存在するディレクトリからの相対パスとして扱われます。日時のフォーマット指定については、config - timefmt を参照して下さい。


<!--#config timefmt="%Y/%m/%d" -->
<!--#flastmod  file="./example.shtml" -->
 flastmod 要素 file 属性の設定例
2015/09/14
 実行結果

include - file

指定したファイルの中身を読込んで表示します。ドキュメントが存在するディレクトリからの相対パスでファイル名を指定します。ただし、../ を含むパス や 絶対パスは使用できません。上位ディレクトリのファイルを指定する場合は、virtual を使用します。


<!--#include file="example.html" -->
 exec 要素 cmd 属性の設定例

ただし、自分自身のファイルを読み込むと無限ループになるため、[an error occurred while processing this directive] が表示されます。また、存在しないファイルを読み込んだ場合も同様のエラーメッセージが表示されます。

include - virtual

指定したファイルの中身を読込んで表示します。ホスト名からの相対パスでファイル名を指定します。パスが / から始まらない場合は、ドキュメントが存在するディレクトリからの相対パスとして扱われます。


ただし、自分自身のファイルを読み込むと無限ループになるため、[an error occurred while processing this directive] が表示されます。また、存在しないファイルを読み込んだ場合も同様のエラーメッセージが表示されます。

printenv

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


<!--#printenv -->
 printenv 要素の設定例
SCRIPT_URL=/example.shtml
SCRIPT_URI=https://murashun.jp/example.shtml
HTTP_CONNECTION=Keep-Alive
・・・(中略)・・・
DOCUMENT_NAME=example.shtml
 実行結果

長いので中略していますが、表示される環境変数としては DATE_GMT, DATE_LOCAL, DOCUMENT_NAME, DOCUMENT_ROOT, DOCUMENT_URI, GATEWAY_INTERFACE, HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, HTTP_CONNECTION, HTTP_HOST, HTTP_UPGRADE_INSECURE_REQUESTS, HTTP_USER_AGENT, HTTP_VIA, HTTP_X_SAKURA_FORWARDED_FOR, LAST_MODIFIED, PATH, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_PORT, REQUEST_METHOD, REQUEST_URI, SCRIPT_FILENAME, SCRIPT_NAME, SCRIPT_URI, SCRIPT_URL, SERVER_ADDR, SERVER_ADMIN, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL, SERVER_SIGNATURE, SERVER_SOFTWARE, USER_NAME などがあります。

set - var

変数の名前を設定できます。変数に値を入れるには、value 属性を使います。


<!--#set var="hoge" value="123" -->
 set 要素 var 属性の設定例

set - value

変数に代入する値を設定できます。変数名の宣言は var 属性を使います。


<!--#set var="hoge" value="123" -->
 set 要素 value 属性の設定例

フロー制御要素

SSI には条件によって表示する内容を制御する "フロー制御要素" (if要素) があります。if 要素はプログラミング言語の if 文と同じように動作します。条件が評価され、結果が true であれば次の elif か else か endif 要素までの文字列が出力に挿入されます。


<!-- if 要素の構文 -->
<!--#if expr="test_condition" -->
  上記の test_condition が true の場合に表示されます。
<!--#elif expr="test_condition" -->
  最初の条件が false 、かつ上記の test_condition が true の場合に表示されます。
<!--#else -->
  すべての条件が false の場合に表示されます。
<!--#endif -->
 if 要素の構文
<!--#if expr="$HTTP_ACCEPT_LANGUAGE = ja" -->
HTTP_ACCEPT_LANGUAGE は日本語が設定されています。
<!--#else -->
HTTP_ACCEPT_LANGUAGE has been set "ja"
<!--#endif -->
 if 要素の分岐例

elif 文や else 文は test_condition が false の場合にテキストが出力されます。これらの要素は任意ですが、最後の endif 文は必須となります。test_condition は以下のいずれかになります。

test_condition の条件式一覧
条件式説明
string文字列 string が空でない場合 true を返します。
string1 = string2
string1 == string2
string1 != string2
string1string2 を比較します。string2/string/ という形式であれば、正規表現として比較されます。正規表現は PCRE エンジンで実装されていて perl 5 と同じ構文を使用します。=== の別名で同じ動作をします。
string1 < string2
string1 <= string2
string1 > string2
string1 >= string2
string1string2 を比較します。文字列として比較 (strcmp 関数を使用) されることに注意してください。そのため、文字列 "100" は "20" よりも小さいことになります。
(test_condition)test_conditionが true の場合、true を返します。
!test_conditiontest_conditionが true の場合、false を返します。
test_condition1 &&
test_condition2
test_condition1 かつ test_condition2
true の場合、true を返します。
test_condition1 ||
test_condition2
test_condition1 または test_condition2
true の場合、true を返します。

パフォーマンスの問題点

パフォーマンスの問題点として、SSI は AddOutputFilter ディレクティブで拡張子を追加できます。もしも .html を追加すると、すべての HTML ドキュメントに対して SSI の構文解析を行うため、利便性は上がりますが、サーバのリソースに悪影響を与えます。そのため、SSI の構文解析を行うファイルは .shtml だけにしておく方が望ましいと言えます。


さくらインターネットのような共用サーバを使用している場合は、サーバのリソースは各ユーザで共有しています。そのため、負荷量の高い SSI を実行する場合は他のユーザにも影響を与えます。極端な場合は、何かしらのペナルティを受ける可能性があります。


SSI は PHP などに比べて負荷は高くありません。PHP はアクセラレータなどを使用することにより、負荷軽減ができるため一概には言えませんが、それでも SSI の負荷は低いと言えます。しかし、サーバに負荷を与えていることには変わらないため、可能な限り静的な HTML ドキュメントで記述し、もしも他に手段がない場合のみ SSI を使いましょう。

セキュリティの問題点

セキュリティの問題点として、例えば SSI の記述が可能な掲示板などでは exec 要素の cmd 属性によって悪意のあるコマンドが実行される SSI インジェクション攻撃の危険性があります。そのため、Options ディレクティブで IncludesNOEXEC を設定することで SSI は許可するが、exec 要素の使用は許可しない設定などの対策を実施しましょう。


特に、パーミッションの設定には注意して下さい。SSI の実行ファイルがパーミッションが 777 である場合は、すぐにセキュリティ面について安全か見直しを行って下さい。一般的には SSI のパーミッションは 755 になりますが、グループユーザに対して権限が不要である場合は、705 まで下げることができないか検討して下さい。個人サイトの場合は、Web サイトの管理人は所有者で、閲覧者はその他のユーザになるため、705でも問題ないと考えます。

まとめ

SSI は動的なページを作成するには比較的簡単な方法です。しかし、ディレクティブが少なく制約が多いために使い勝手が悪く、今ではあまり使われていません。SSI を使用する場合は、Javascritp や PHP などで代用できないかを検討することを推奨します。