HOME
Apache の INCLUDES フィルタにより実装されている Server Side Includes の書き方について説明します。SSI を使用するための設定から、各ディレクティブの説明、パフォーマンスとセキュリティの問題点も取り扱います。
SSI (Server Side Includes) とは、HTML ページの中に Web サーバ側で実行するコマンドを埋め込んでおき、その実行結果をクライアントに返す仕組みです。例えば、以下の例ではファイルの最終更新日時を返すコマンドを埋め込んでいる例です。
<html>
<head>
<title>Sample SSI</title>
</head>
<body>
このファイルは
<!--#echo var="LAST_MODIFIED" -->
に更新されました。
</body>
</html>
# 実行結果
このファイルは Monday, 31-Aug-2015 10:39:30 JST に更新されました。
ただし、通常の HTML ファイルに上記のコードを埋め込んでも何も表示されません。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
上記の設定により、Apache にファイルの SSI ディレクティブを解析させることを許可しています。解析を行うファイルを指定するには AddOutputFilter ディレクティブ、または XBitHack ディレクティブで指定します。
AddOutputFilter ディレクティブを使用する場合、どの拡張子に対して SSI ディレクティブの解析するかを指定します。下記の例では、拡張子 .shtml に対して SSI ディレクティブの解析するよう Apache に伝えています。
# AddOutputFilter ディレクティブで SSI を有効にする例
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
ただし、上記の例では既存のページに SSI ディレクティブを追加したい場合、拡張子を変更しなければならない欠点があります。その場合、そのページの拡張子と、そのページへのすべてのリンクを変更しなければなりません。もしも拡張子に .html を指定した場合は、それらの問題は回避できますが、後述するパフォーマンスの問題が発生します。
AddOutputFilter ディレクティブの詳細は、.htaccessの書き方を参照して下さい。
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
# 実行ビット (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
上記の例では、サーバに SSH でログインし、コンソール上からパーミッションを変更している例となります。chmod
コマンドにより、実行ビット ("x") を追加しています。実行ビットを追加後に ls -l
コマンドで対象ファイルのパーミッションを確認すると、実行ビットが付与されていることが確認できます。
XBitHack ディレクティブの詳細は、.htaccessの書き方を参照して下さい。
SSI を使用するための設定が完了したら、対象ファイルに SSI ディレクティブ(命令) を埋め込むことができます。SSI は、特別なコマンドが埋め込まれた HTML ドキュメントとしてパース (構文解析) されます。コマンドには、HTML のように element
(要素) 、attribute
(属性)、value
(属性値) を持ちます。コマンドの構文は以下の通りです。
<!-- SSI のコマンド構文 -->
<!--#element attribute=value [attribute=value] ... -->
value
は "
で囲むのが一般的ですが、'
や `
も使用できます。また、最初の <!--#
はまとめて 1 つの句として解釈されるため、スペースを入れないように注意して下さい。ただし、最後の -->
の前には、逆にスペースを入れる必要があるため、こちらも注意が必要です。SSI のコマンドで使用可能な要素と属性は下表の通りです。
要素 | 説明 |
---|---|
config | SSI コマンドのエラーメッセージや、日付フォーマット、ファイルサイズフォーマットを設定を定義できます。 |
echo | 指定した変数、または環境変数を表示します。未定義の場合は、(none) と表示されます。このエラーメッセージは config 要素の echomsg 属性や、SSIUndefinedEcho ディレクティブで変更可能です。 |
exec | 指定したコマンドや CGI スクリプトを実行し、その結果を表示します。さくらインターネットのレンタルサーバで CGI スクリプトを実行する場合は、同じディレクトリにファイルを配置する必要があります。また、その他の注意事項・制限事項については公式ヘルプを参照して下さい。 |
fsize | 指定したファイルのサイズを表示します。 ファイルサイズのフォーマットは、 config 要素の sizefmt 属性で変更可能です。 |
flastmod | 指定したファイルの最終更新時刻を表示します。 日付のフォーマットは config 要素の timefmt 属性で変更可能です。 |
include | 指定したファイルの中身を読込んで表示します。 |
printenv | 使用可能な環境変数の一覧を表示します。Apache 1.2 以降で使用可能です。 |
set | 任意の変数に値を代入できます。Apache 1.2 以降で使用可能です。 |
要素 | 属性 | 説明 |
---|---|---|
config | echomsg | echo 要素が未定義の変数をエコーしようとした際に、表示されるメッセージを定義します。指定した場合は、SSIUndefinedEcho ディレクティブを上書きします。本属性は、Apache 2.1 以降で使用可能です。 |
errmsg | ドキュメントの解析中にエラーが発生した場合、表示されるメッセージを定義します。指定した場合は、SSIErrorMsg ディレクティブを上書きします。 | |
sizefmt | Apache の公式リファレンスには abbrec と書かれていますがabbrev が正しい表記です。 fsize 要素で表示されるファイルサイズのフォーマットを指定します。bytes を属性値に指定するとバイト単位で表示されます。(単位は表示されず整数表示となります。) abbrev [1] を属性値に指定すると単位が "K" (KByte) や "M" (MByte) で表示されます。 | |
timefmt | 時刻を表示する際のフォーマットを定義します。%Y や %M などの strftime 関数の変換指定子が使用できます。 | |
echo | var | 要素の表で説明したものと同様です。使用可能な環境変数は後述します。また、サーバによっては HTTP 環境変数の一部も使用可能です。さくらインターネットのレンタルサーバでは HTTP 環境変数の一部が使用可能です。 |
encoding | 変数を出力する前に、変数の中に含まれる特殊文字をどのようにエンコードするかを指定します。none はエンコードを行いません。url はパーセントエンコードを行います。entity は HTMLエンコードを行います。クロスサイトスクリプティングの脆弱性を回避するために、ユーザからのデータを受け取る場合は常にエンコードを行って下さい。 | |
exec | cgi | 指定した CGI スクリプトを実行し、その結果を表示します。 |
cmd | 指定したコマンドを実行し、その結果を表示します。 | |
fsize | file | ドキュメントが存在するディレクトリからの相対パスでファイル名を指定します。ただし、../ を含むパス や 絶対パスは使用できません。上位ディレクトリのファイルを指定する場合は、virtual を使用します。 |
virtual | ホスト名からの相対パスでファイル名を指定します。パスが / から始まらない場合は、ドキュメントが存在するディレクトリからの相対パスとして扱われます。 | |
flastmod | file | fsize 要素の file 属性と同様です。 |
virtual | fsize 要素の virtual 属性と同様です。 | |
include | file | fsize 要素の file 属性と同様です。 |
virtual | fsize 要素の virtual 属性と同様です。 | |
printenv | - | 要素の表で説明したものと同様です。 |
set | var | 変数の名前を設定できます。 |
value | 変数に代入する値を設定できます。 |
echo 要素が未定義の変数をエコーしようとした際に、表示されるメッセージを定義します。下記の例では、echomsg に "変数は宣言されていません" という文字列を設定して、定義済みの変数 (msg) と未定義の変数 (hoge) を echo した結果を表示しています。
<!--#config echomsg="変数は宣言されていません" -->
<!--#set var="msg" value="Hello, world!" -->
<!--#echo var="hoge" --><br>
<!--#echo var="msg" -->
変数は宣言されていません
Hello, world!
ドキュメントの解析中にエラーが発生した場合、表示されるメッセージを定義します。下記の例では、echomsg に "エラーが発生しました" という文字列を設定して、SSI ディレクティブには存在しない #hoge
を実行した結果を表示しています。
<!--#config errmsg="エラーが発生しました" -->
<!--#hoge var="msg" value="Hello, world!" -->
エラーが発生しました
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>
314
2,186,087
314
2.1M
上記の例では、abbrev を指定しても sample1.html は小数点表示にはならず、sample2.html は切り下げて表示されています。また、存在しないファイルを指定した場合、"[an error occurred while processing this directive]"
と表示されます。
時刻を表示する際のフォーマットを定義します。%Y や %M などの strftime 関数の変換指定子が使用できます。使用できる変換指定子は以下の通りです。
変換指定子 | 表示例 | 説明 |
---|---|---|
%a | Mon | 曜日 (英字3文字) |
%A | Monday | 曜日 (英字) |
%b | Sep | 月 (英字3文字) |
%B | September | 月 (英字) |
%c | Mon Sep 14 19:41:01 2015 | 曜日 (英字3文字) 月 (英字3文字) 日 時:分:秒 年 |
%C | 20 | 年 (上2桁) |
%d | 14 | 日 (先頭に0を含む2桁表示) |
%D | 09/14/15 | 月/日/年 (下2桁) |
%E | - | 別形式を使用する際の修飾子。 |
%F | 2015-09-14 | 年-月-日 |
%g | 15 | 年 (ISO 週番号 (%V) に対応する年の下2桁表示) |
%G | 2015 | 年 (ISO 週番号 (%V) に対応する年の4桁表示) |
%h | Sep | %b と同じです。 |
%H | 19 | 時。00 ~ 23 (24時間表示) |
%I | 07 | 時。00 ~ 12 (12時間表示) |
%j | 257 | 1 月 1 日からの日数。001 ~ 366 (先頭に0を含む3桁表示) |
%k | 19 | 時。0 ~ 23 (24時間表示。1桁の場合は先頭にスペースを置く) |
%l | 7 | 時。0 ~ 12 (12時間表示。1桁の場合は先頭にスペースを置く) |
%m | 09 | 月 |
%M | 41 | 分 |
%n | - | 改行 (br要素ではなく改行コードが入る) |
%O | - | 別形式を使用する際の修飾子。 |
%p | PM | AM または PM |
%P | pm | am または pm |
%r | 19:41:01 PM | 午前・午後形式での時刻。%I:%M:%S %p と同じ。 |
%R | 19:41 | 24時間表示での時:分。%H:%M と同じ。 |
%s | 1442231134 | 1970-01-01 00:00:00 +0000 (UTC) からの秒数。 |
%S | 01 | 秒 |
%T | 19:41:01 | 24時間表示の時:分:秒。%H:%M:%S と同じ。 |
%u | 1 | 1 (月曜) ~ 7 (日曜) |
%U | 37 | 週番号。00 ~ 53 (最初の日曜日を第一週目の開始日とする) |
%V | 38 | 週番号。01 ~ 53 (最初の週が4日以上あれば1として計算する) |
%w | 1 | 0 (月曜) ~ 6 (日曜) |
%W | 37 | 週番号。00 ~ 53 (最初の月曜日を第一週目の開始日とする) |
%x | 09/14/15 | 月/日/年 (下2桁) |
%X | 19:41:01 | 時:分:秒 |
%y | 15 | 年 (下2桁) |
%Y | 2015 | 年 |
%Z | JST | タイムゾーン |
%z | +0900 | +hhmm や -hhmm の形式のタイムゾーン。 (UTC へのオフセット時間) |
%+ | Mon Sep 14 19:41:01 | 曜日 (英字3文字) 月 (英字3文字) 日 時:分:秒 タイムゾーン 年 |
<!--#config timefmt="%Y/%m/%d" -->
<!--#echo var="DATE_LOCAL" --><br>
<!--#flastmod file="example.shtml" -->
2015/09/14
2015/09/14
上記の例では、年・月・日を /
を区切ったフォーマットを表示しています。"DATE_LOCAL" は現在日時を表し、"flastmod" は "example.shtml" の最終更新時刻を表します。
指定した変数、または環境変数を表示します。未定義の場合は、(none) と表示されます。また、サーバによっては HTTP 環境変数の一部も使用可能です。さくらインターネットのレンタルサーバでは HTTP 環境変数の一部が使用可能です。使用可能な環境変数は以下の通りです。
環境変数名 | 説明 |
---|---|
DOCUMENT_NAME | 表示しているドキュメントのファイル名が含まれます。 |
DOCUMENT_URI | 表示しているドキュメントの URL が含まれます。 |
QUERY_STRING_UNESCAPED | GET クエリの文字列が含まれます。 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" -->
example.shtml
Hello, world!
(none)
変数を出力する前に、変数の中に含まれる特殊文字をどのようにエンコードするかを指定します。"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 した場合は文字化けを起こします。また、encoding="none" は var の前に設定しなければ効果がありません。ファイルを保存する場合の文字コードと、ブラウザの表示エンコードが一致しているかも確認して下さい。
指定した CGI スクリプトを実行し、その結果を表示します。さくらインターネットのレンタルサーバで CGI スクリプトを実行する場合は、同じディレクトリにファイルを配置する必要があります。
<!--#exec cgi="example.cgi" -->
さくらインターネットの場合は、/cgi-bin
ディレクトリ配下でしか CGI スクリプトが動作しないため、shtml も /cgi-bin
ディレクトリ配下に配置する必要があります。もしも .pl ファイルを実行する場合は、cmd 属性を使用して下さい。
指定したコマンドを実行し、その結果を表示します。設定された文字列は /bin/sh
で実行されます。引数 (arg1, arg2 ...) を指定する場合は、スペースで区切って指定して下さい。Perl 側で引数を受け取るには @ARGV
を参照して下さい。
<!-- 引数なしの場合 -->
<!--#exec cmd="/bin/ls" -->
<!-- 引数ありの場合 -->
<!--#exec cmd="/bin/ls arg1 arg2" -->
<!-- .pl を実行する場合 -->
<!--#exec cmd="example.pl" -->
ただし、サーバによってはコマンド名に絶対パスを指定できない、パス名で上位ディレクトリ (..
) を参照できない、コマンドの引数を渡せない、コマンド実行時のカレントディレクトリが異なるなどの違いがあります。さくらインターネットの場合は、cmd の実行が許可されていないため、上記のコマンドは使えません。ただし、同ディレクトリにある .pl などのスクリプトファイルの実行は可能です。
指定したファイルのサイズを表示します。ファイルサイズのフォーマットは、config 要素の sizefmt 属性で変更可能です。ドキュメントが存在するディレクトリからの相対パスでファイル名を指定します。ただし、../ を含むパス や 絶対パスは使用できません。上位ディレクトリのファイルを指定する場合は、virtual を使用します。設定例については、config - sizefmt を参照して下さい。
指定したファイルのサイズを表示します。ファイルサイズのフォーマットは、config 要素の sizefmt 属性で変更可能です。ホスト名からの相対パスでファイル名を指定します。パスが / から始まらない場合は、ドキュメントが存在するディレクトリからの相対パスとして扱われます。設定例については、config - sizefmt を参照して下さい。
指定したファイルの最終更新時刻を表示します。日付のフォーマットは config 要素の timefmt 属性で変更可能です。ドキュメントが存在するディレクトリからの相対パスでファイル名を指定します。ただし、../ を含むパス や 絶対パスは使用できません。上位ディレクトリのファイルを指定する場合は、virtual を使用します。日時のフォーマット指定については、config - timefmt を参照して下さい。
<!--#config timefmt="%Y/%m/%d" -->
<!--#flastmod file="example.shtml" -->
2015/09/14
指定したファイルの最終更新時刻を表示します。日付のフォーマットは config 要素の timefmt 属性で変更可能です。ホスト名からの相対パスでファイル名を指定します。パスが / から始まらない場合は、ドキュメントが存在するディレクトリからの相対パスとして扱われます。日時のフォーマット指定については、config - timefmt を参照して下さい。
<!--#config timefmt="%Y/%m/%d" -->
<!--#flastmod file="./example.shtml" -->
2015/09/14
指定したファイルの中身を読込んで表示します。ドキュメントが存在するディレクトリからの相対パスでファイル名を指定します。ただし、../ を含むパス や 絶対パスは使用できません。上位ディレクトリのファイルを指定する場合は、virtual を使用します。
<!--#include file="example.html" -->
ただし、自分自身のファイルを読み込むと無限ループになるため、[an error occurred while processing this directive]
が表示されます。また、存在しないファイルを読み込んだ場合も同様のエラーメッセージが表示されます。
指定したファイルの中身を読込んで表示します。ホスト名からの相対パスでファイル名を指定します。パスが / から始まらない場合は、ドキュメントが存在するディレクトリからの相対パスとして扱われます。
ただし、自分自身のファイルを読み込むと無限ループになるため、[an error occurred while processing this directive]
が表示されます。また、存在しないファイルを読み込んだ場合も同様のエラーメッセージが表示されます。
使用可能な環境変数の一覧を表示します。
<!--#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
などがあります。
変数の名前を設定できます。変数に値を入れるには、value 属性を使います。
<!--#set var="hoge" value="123" -->
変数に代入する値を設定できます。変数名の宣言は var 属性を使います。
<!--#set var="hoge" value="123" -->
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 expr="$HTTP_ACCEPT_LANGUAGE = ja" -->
HTTP_ACCEPT_LANGUAGE は日本語が設定されています。
<!--#else -->
HTTP_ACCEPT_LANGUAGE has been set "ja"
<!--#endif -->
elif 文や else 文は test_condition
が false の場合にテキストが出力されます。これらの要素は任意ですが、最後の endif 文は必須となります。test_condition
は以下のいずれかになります。
条件式 | 説明 |
---|---|
string | 文字列 string が空でない場合 true を返します。 |
string1 = string2 | string1 と string2 を比較します。string2 が /string/ という形式であれば、正規表現として比較されます。正規表現は PCRE エンジンで実装されていて perl 5 と同じ構文を使用します。== は = の別名で同じ動作をします。 |
string1 < string2 | string1 と string2 を比較します。文字列として比較 (strcmp 関数を使用) されることに注意してください。そのため、文字列 "100" は "20" よりも小さいことになります。 |
(test_condition) | test_condition が true の場合、true を返します。 |
!test_condition | test_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 などで代用できないかを検討することを推奨します。