SSIemu - 疑似SSIエミュレータ


概要

 CGIが使えるがSSIが使えないサーバで、擬似的にSSIコマンドを実行して結果をファイルに埋め込むためのCGIスクリプトです。

 このスクリプトはダミーの透明GIFファイルを生成するCGIスクリプトとして動作します(ダミー画像ファイルはCGIに埋め込まれているので別途用意の必要はありません)。対象HTMLファイルを開くと、イメージタグを使ってこのCGIスクリプトが起動され、HTMLファイル中のSSI互換コマンドに従ってHTMLファイルが書き換えられるという動作原理です。従って、リアルタイムなデータ更新が出来ませんし(前にページを開いた時点での実行結果が表示される)、ユーザの個人情報などユーザ毎に固有のメッセージを表示するのにも向きません。しかしながら、SSIアクセスカウンタ等には十分実用になるとは思います。

 なお、本物のSSIコマンドはHTMLファイルに<!--#(SSIコマンド)-->の形式で埋め込みますが、SSIを禁止しているサーバでは、この形式でSSIコマンドを書くとサーバエラーになることもあります。また、動作原理上、プログラムはどこからどこまでがSSIコマンドの出力なのか把握する必要があります。従って、HTMLファイル中には、#の代わりに*を使って<!--*(SSI互換コマンド)--><!--END-->の形式で記述してください。


サポートしている機能

機能 本物のSSI SSIemuの疑似SSIコマンド
サイズ表示フォーマットの変更 <!--#config sizefmt="〜"--> 未サポート
時刻表示フォーマットの変更 <!--#config timefmt="〜"--> <!--*config timefmt="〜"-->
ただし、フォーマット文字列は&j(1月1日からの日数)は未対応
エラーメッセージの変更 <!--#config errmsg="〜"--> 未サポート
環境変数を埋め込み <!--#echo var="〜"--> <!--*echo var="〜"--><!--END-->
他ファイルの内容を埋め込み <!--#include file="〜"-->
<!--#include virtual="〜"-->
未サポート
ファイルサイズを埋め込み <!--#fsize file="〜"-->
<!--#fsize virtual="〜"-->
未サポート
最終更新日時を埋め込み <!--#flastmod file="〜"-->
<!--#flastmod virtual="〜"-->
未サポート
SSIスクリプトの実行結果を埋め込み <!--#exec cmd="〜"--> <!--*exec cmd="〜"--><!--END-->
CGIスクリプトの実行結果を埋め込み <!--#exec cgi="〜"--> 未サポート

環境変数について

 環境変数名は、CGIで参照できる環境変数は参照可能(なはず)です。

 ただし、動作原理上、HTTP_REFERERは疑似SSIコマンドを埋め込んだHTMLファイル自身のファイル名になってしまいます。IPアドレスとか(パスワード制限ページの)ユーザIDも取得可能だとは思いますが、HTMLファイルを書き換えた結果は次の人が見るときにも残ってしまうので、HTMLファイルには埋め込まない方がよいです(せいぜいSSIスクリプトでアクセスログを取る程度がよい)。

 echo var="〜"に限り、LAST_MODIFIEDも一応対応しているものの、HTMLファイルを書き換えてしまってタイムスタンプが狂うので無意味です。


制限事項

  1. CGIサーバとHTMLサーバの分かれている場合、CGIからHTMLファイルを書き換えできない場合はこのプログラムは使用できません。また、HTMLファイルの書き込み許可属性をオンに(606あるいは666)できない場合も使用できません。
  2. 疑似SSIコマンドの実行結果は、動作原理上、本物のSSIと違い、即時に反映はされません。リロードすれば最新の結果が表示されます。
  3. 環境変数HTTP_REFERERは取得できません。よってアクセス元をSSIで取る用途には使用できません。
  4. 一つの行に複数の疑似SSIコマンドを記述できません。複数のコマンドを記述する場合は必ず行を改めてください。
  5. SSIスクリプトの出力結果に改行コードが含まれる場合は、すべて取り除かれます。SSIスクリプトの出力する改行コードがどうしても必要な場合は、SSIスクリプト自体を改造して改行コードがなくてもうまく表示できるようにするか、あきらめてください。
  6. SSIコマンドを実行するたびにHTMLファイルが書き換えられてしまいます。従ってその都度タイムスタンプが更新されます。(CGIはサーバ上ではユーザnobodyが実行するが、その場合utime関数でタイムスタンプを元通りに戻せないので)
  7. 一応ファイルロックは付けていますが、それでも万一タイミングがバッティングするとHTMLファイル自体なくなってしまう可能性も(まれだとは思いますが)考えられますので念頭に置いておいてください。

サンプル

 例えば、このサーバに置いてあるサンプルではこのようなディレクトリ構成になっています。

/cgi
  |--ssiemu.htm  SSIコマンドを埋め込むHTMLファイル(パーミッション606 or 666)
  |--ssiemu.cgi  SSIemu本体(パーミッション705 or 755)
  |--/lock       ロックファイル用ディレクトリ(パーミッション707 or 777)
  |
  |--counter.pl  SSIスクリプトの例1(パーミッション705 or 755)
  |--filetime.pl SSIスクリプトの例2(パーミッション705 or 755)

 この場合のHTMLファイルへの記述例は以下の通りとなります。

HTMLファイルへの記述

環境変数表示の例<br>
このサーバの名前<!--*echo var="SERVER_NAME"--><!--END--><br>
<br>
ファイル更新日時表示の例(今のところうまくいきません。ゴメンナサイ)<br>
<!--*config timefmt="%y/%m/%d %H:%M"--><!--*echo var="LAST_MODIFIED"--><!--END--><br>
<br>
SSIスクリプト呼び出しの例<br>
アクセスカウンタ:<!--*exec cmd="count.pl"--><!--END--><br>
このファイルの最終更新日時:<!--*exec cmd="filetime.pl ssiemu.html"--><!--END--><br>
<br>
 このCGIの呼び出しをHTMLファイルのどこか(&lt;/body&gt;タグの直前を推奨)に入れておいてください。<br>
 html=の後には、ssiemu.cgiから見たHTMLファイル名を記述します。<br>
<img src="ssiemu.cgi?html=ssiemu.html">

実行結果(本物のSSIは一切使ってません!!)

環境変数表示の例
このサーバの名前kan-chan.stbbs.net

ファイル更新日時表示の例(今のところうまくいきません。ゴメンナサイ)
14/09/19 05:29

SSIスクリプト呼び出しの例
アクセスカウンタ:13055
このファイルの最終更新日時:2014/09/19(金) 05:29

 このCGIの呼び出しをHTMLファイルのどこか(</body>タグの直前を推奨)に入れておいてください。
 html=の後には、ssiemu.cgiから見たHTMLファイル名を記述します。


ダウンロード

"ssiemu.txt"のファイル名をあとで"ssiemu.cgi"に変更してからお使いください。


戻る