SSI は Server Side Includes の略です。HTML文書中に以下のようなコメントを挿入することにより、サーバー側がコメントの場所に実行コマンドの結果などを置き換えてくれたりする機能です。
<!--#exec cmd="/bin/ls" -->
SSI を使用することにより、例えば次のようなことが可能になります。
SSI を使用するには、WWW サーバーが SSI をサポートしており、SSI を許可する設定が行われている必要があります。一般のプロバイダでは、セキュリティのために使用を禁止しているところも多いようです。
サポートしていても、拡張子を .shtml にしなければならない、SSI を置けるフォルダが決まっている、自分で .htaccess の設定を行わなければならないなどいろいろあります。詳細はプロバイダにお問い合わせください。
サーバーが Apache の場合は、httpd.conf か .htaccess に以下の記述が追加されている必要があります。( httpd.conf を変更した場合は Apache を再起動してください。)
AddType text/x-server-parsed-html .shtml Options Includes
また、.htaccess で AddType や Options の指定を可能にするには、httpd.conf で以下の設定を行ってください。「許可対象」には、FileInfo(AddType などの指定を可能にする)、Options(Optionsの指定を可能にする)、All(すべての指定を可能にする)などを指定します。
AllowOverride 許可対象
.shtml のファイルだけでなく、拡張子が .html のファイルでも SSI を使用したいときは、AddType の行を次のようにしてください。ただし、.html のファイルに対しても、サーバーで SSI 処理を行うので、サーバーに負荷がかかります。
AddType text/x-server-parsed-html .shtml .html
ファイルの最終更新時刻を表示します。
このファイルは <!--#config timefmt="%Y/%m/%d %X" --> <!--#echo var="LAST_MODIFIED" --> に更新されました。
ダウンロードファイルの最終更新日とサイズを表示します。
ダウンロードは <a href="xxx.zip">xxx.zip</a> (<!--#config timefmt="%Y/%m/%d" --> <!--#flastmod file="xxx.zip" -->更新, <!--#config sizefmt="abbrev" --> <!--#fsize file="xxx.zip" -->) を読込んでください。
ヘッダ/フッタを指定します。
<html> <head> <title>Sample Page</title> </head> <body> <!--#include file="header.html" --> 本文 <!--#include file="footer.html" --> </body> </html>
指定したファイルの中身を読込んで表示します。file="~" の ~ にはファイル名を指定します。../ や絶対パス名は使用できない場合があります。virtual="~" の ~ には指定するファイルの仮想パス名(「http://サーバー名/パス名」の「/パス名」の部分)を指定します。
<!--#include file="header.html" --> : <!--#include file="footer.html" -->
指定したファイルのサイズを表示します。表示のフォーマットは <!--#config sizefmt="..." --> で指定したものに従います。file="~" と virtual="~" の説明は #include と同様です。
<!--#config sizefmt="abbrev" --> <a href="xxx.zip">ダウンロード</a> (サイズ:<!--#fsize file="xxx.zip" -->)
#fsizeコマンドなどで表示されるファイルサイズのフォーマットを指定します。~ に bytes を指定するとバイト単位で、abbrev を指定すると Bytes, KBytes, MBytes などの適切な単位で表示されるようになります。
指定したファイルの最終更新時刻を表示します。表示のフォーマットは <!--#config timefmt="..." --> で指定したものに従います。file="~" と virtual="~" の説明は #include と同様です。
最終更新日:<!--#flastmod file="this.html" -->
#echoコマンドなどで時刻を表示する際のフォーマットを指定します。~ には %Y/%m/%d %H:%M:%s などの文字列を指定します。 %Y や %m は次のような意味を持ちます。
置換文字 | 表示例 | 意味 |
---|---|---|
%c | 10/30/97 11:22:33 | 月/日/年 時:分:秒 |
%x | 10/30/97 | 月/日/年 |
%X | 11:22:33 | 時:分:秒 |
%y | 97 | 年(2桁) |
%Y | 1997 | 年(4桁) |
%b | Oct | 月(3文字) |
%B | October | 月(フルスペル) |
%m | 08 | 月(2桁) |
%a | Sat | 曜日(3文字) |
%A | Saturday | 曜日(フルスペル) |
%d | 30 | 日(2桁) |
%j | 223 | 1月1日からの日数 |
%w | 6 | 日曜日からの日数 |
%p | PM | AMもしくはPM |
%H | 23 | 時(24時間制) |
%I | 11 | 時(12時間制) |
%M | 44 | 分 |
%S | 56 | 秒 |
%Z | JST | タイムゾーン |
指定した環境変数の値を表示します。~ には LAST_MODIFIED などの環境変数名を指定します。環境変数名には次のようようなものがあります。
環境変数 | 意味 |
---|---|
DOCUMENT_NAME | この文書のファイル名(wwwssi.htm) |
DOCUMENT_URI | 文書の仮想パス名(/wwwssi.htm) |
QUERY_STRING_UNESCAPED | WWWクライアントから検索用に送信された文字列。いくつかの記号文字(UNIXのシェルのメタ文字)はパックスラッシュ( \ )でエスケープされているので注意。 |
DATE_LOCAL | 現在の時刻(ローカル時刻) |
DATE_GMT | 現在の時刻(グリニッジ標準時) |
LAST_MODIFIED | この文書の最終更新時刻 |
サーバーによっては、「CGIスクリプトが参照可能な環境変数」も表示できます。時間の表示は <!--#config timefmt="..." --> で指定したフォーマットに従います。
最終更新日:<!--#echo var="LAST_MODIFIED" -->
使用可能な環境変数の一覧を表示します。Apache 1.2 以上のバージョンで使用できます。printenv と --> の間にスペースを忘れないでください。
<pre> <!--#printenv --> </pre>
変数 ~ に、値 ~ を代入します。Apache 1.2 以上のバージョンで使用可能です。
<!--#set var="msg" value="Hello!!" --> <!--#echo var="msg" -->
文書処理中にエラーが発生した場合のエラーメッセージを指定します。これはWWWサーバーのエラーログにも記録されます。
~ で指定したコマンドやCGIを実行し、その結果を表示します。
<!--#exec cmd="/bin/ls" --> <!--#exec cgi="./cgi-bin/count.cgi" -->
cgi="..." で呼び出す際は、CGI側で Content-type: text/html などのヘッダを出力してやる必要があります。
引数(arg1, arg2, ...)を指定する際は、cmd="/bin/xxx arg1 arg2" などのようにスペースで区切って指定します。(perlで引数を受け取るには @ARGV を参照します。)
サーバーの種類やバージョンによっては、コマンド名に絶対パスを指定できない、パス名で上位のディレクトリ(..)を参照できない、コマンドの引数を渡せない、コマンド実行時のカレントディレクトリが異なる・・・などの違いがあるようです。ちなみに、私が使用している Apache/1.3.4 では以下の状況でした。
○ <!--#exec cgi="xx.cgi" --> × <!--#exec cgi="xx.cgi arg1 arg2" --> × <!--#exec cgi="xx.cgi?arg1+arg2" --> × <!--#exec cmd="xxx.pl" --> ○ <!--#exec cmd="./xxx.pl" --> ○ <!--#exec cmd="./xxx.pl arg1 arg2" --> ○ <!--#exec cmd="/bin/ls arg1 arg2" -->
条件によって表示する内容を制御します。条件演算子には、等しい(=)、等しくない(!=)、辞書的に小さい(<)、等しいか小さい(<=)、大きい(>)、等しいか大きい(>=)、否定(!)、かつ(&&)、または(||)を使用できます。/.../ の形式を用いた場合は、正規表現によるマッチングを使用できます。#else や #endif の後ろのスペースを忘れないでください。
<!--#if expr="$HTTP_ACCEPT_LANGUAGE = ja" --> こんにちわ。 <!--#else --> Hello!! <!--#endif -->
<!--#if expr="$HTTP_USER_AGENT = /compatible; MSIE/" --> Internet Explorer をお使いですね。 <!--#endif -->
<!--#if expr="($a = A) && ($b = B)" --> こんにちわ。 <!--#endif -->
使えると便利な SSI ですが、いくつか注意点があります。
*.html や *.htm のファイルに対して SSI を使用可能にしておくと、Webサーバーが大半のファイルに対して SSI の構文解析や処理を行うことが必要となるため、パフォーマンスに影響を与えます。これは、*.shtml のファイルだけ SSI 処理するようにすることで軽減することができます。
*.html や *.htm のファイルに対して SSI を使用可能にしておくと、例えば、HTMLタグを禁止していない掲示板で「<!--#exec cmd="悪意のあるコマンド"-->」と書き込まれた時にヤバイことになります。これも *.shtml のファイルだけ SSI処理するようにすることで軽減できますが、もし、何らかの手段で、サーバに *.shtml のファイルをアップロードされてしまうと、やはり、悪意のコマンドが実行されてしまうことになります。
SSI を使用する際は、上記の点に十分ご注意ください。