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のコマンド一覧
コマンド | オプション | 値 |
---|---|---|
#include | file | ファイル名 |
virtual | ファイル名 | |
#exec | cmd | 外部コマンド名 |
cgi | CGIプログラム名 | |
#config | errmsg | 文字列 |
timefmt | フォーマット | |
sizefmt | bytes | |
abbrev | ||
#fsize | file | ファイル名 |
virtual | ファイル名 | |
#flastmod | file | ファイル名 |
virtual | ファイル名 | |
#echo | var | DOCUMENT_NAME |
DOCUMENT_URL | ||
DATE_LOCAL | ||
DATE_GMT | ||
LAST_MODIFIED | ||
QUERY_STRING_UNESCAPED | ||
#printenv | ||
#set | var | 変数名 |
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 は次のような意味を持ちます。
置換文字 | 表示例 | 意味 |
---|---|---|
%c | 08/27/09 12:43:54 | 月/日/年 時:分:秒 |
%x | 08/27/09 | 月/日/年 |
%X | 12:43:54 | 時:分:秒 |
%y | 09 | 年(2桁) |
%Y | 2009 | 年(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 | タイムゾーン |
環境変数表示( #echo )
<!--#echo var="〜" -->
指定した環境変数の値を表示します。〜 には LAST_MODIFIED などの環境変数名を指定します。
環境変数名には次のようようなものがあります。
環境変数 | 意味 |
---|---|
DOCUMENT_NAME | アクセスされたファイル名(ssi.html) |
DOCUMENT_URI | アクセスされたURI(/ssi/ssi.html) |
QUERY_STRING | GETクエリ |
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 -->
関連記事
スポンサーリンク