[もくじへトップページへ次ページへ]

 1.SSIとは

 SSI(Server Side Include)とは、HTMLファイルの中に、<!--# ****** -->

 のように記述することにより、サーバー内に組み込まれたコマンドを実行する仕組

 みです。ファイルの更新時刻を表示させたり、テキストカウンタの表示などに利用

 できます。

 プロバイダにより、セキュリティーの等の問題から、CGIは許可していてもSSIは許

 可していない場合があります。また、SSIの記述が含まれるファイルは、「.shtml」

 という拡張子を付けなければならない場合があります。

 ここでは、SSIで使われるコマンドを例示し、最後にテキストカウンタを作成し実

 行させてみます。





 
2.SSIを使う準備(MIMEを有効にする)

 エディタで、次のようにタイプします。これは、ほとんどのサーバが準拠している

 NCSA‐httpdでの設定です。


 Options +ExecCGI +Includes -Indexes
 AddType text/x-server-parsed-html .html
 AddType text/x-server-parsed-html .htm
 AddType application/x-httpd-cgi .cgi



 これは、拡張子が「.html」と「.htm」のファイルの中にSSIの記述があると、実行

 可能になるおまじないのようなものです。

 「_htaccess.txt」という名前で保存し、サーバーにテキストモード(アスキーモー

 ド)でpublic-htmlに転送したのち「.htaccess」に書換えます。パーミッション

 は必要ありません。

 ※ MIMEとは、画像や音声やアーカイブなどの、あらゆる種類のデータを明確に分

 別するための約束事のことです。

 ※ プロバイダによっては、.htaccessが必要でない場合もあります。





 
3.SSIの記述方法

 HTMLファイルの中に、<!--#command option="・・・"--> を挿入するだけです。





 
4.主なコマンドの種類


 
(1)日付時刻の表示
 


 <!--#config timefmt="%Y年%m月%d日"-->

 <!--#echo var="DATE_LOCAL"-->


  表示 


     %Yなどは表示のフォーマットです。主なものを示します。

置換文字 意味
%c 日付と時刻
%x 日付
%X 時刻
%H 時(24時間制)
%I 時(12時間制)
%M
%S
%y 年(2桁)
%Y 年(4桁)
%b 月(3文字)
%B 月(フル表示)
%d 日(2桁)
%a 曜日(3文字)
%A 曜日(フル表示)
%p a.m.またはp.m.
%Z タイムゾーン

     DATE_LOCALは環境変数です。主なものを示します。

環境変数 意味
DATE_LOCAL 現在の時刻(ローカル)
DATE_GMT 現在の時刻(グリニッジ)
DOCUMENT_NAME この文書のファイル名
DOCUMENT_URI この文書のパス
LAST_MODIFIED この文書の最終更新時刻

 (2)ファイルサイズの表示


 <!--#config sizefmt="bytes"-->

 <!--#fsize file="ssi1.html"-->



  表示 


     bytesはファイルサイズのフォーマットです。

     bytes  : Bytes単位で表示

     abbrev : Bytes,KBytes,MBytesなどで表示

     ssi1.htmlはファイル名です。



 (3)ファイルの更新日の表示 



 <!--#config timefmt="%Y年%m月%d日"-->

 <!--#flastmod file="ssi1.html"-->


  表示 


     ssi1.htmlはファイル名です。



 (4)ファイルを読み込んで表示
 


 <!--#include file="test.html"-->


  表示 


     test.htmlはファイル名です。



 (5)CGIを実行


 <!--#exec cgi="../cgi-bin/ssicnt/count.cgi"-->


 
  表示 


     ../cgi-bin/ssicnt/count.cgiはCGIのパスです。



 
5.アクセスカウンタ

 リストの中にコメントを入れましたので、解読してみて下さい。

 なお、このスクリプトはHTMLでの表示を見やすくするため全角スペースを使っ

 ていますので、そのままコピーしても動作しません。ここをクリックして表示させ 

 ものをcount.cgiというファイル名で保存しお使いください。

count.cgiリスト

#!/usr/local/bin/perl

##################################################################
# Program         : count.cgi(Perl) SSI使用
 $ver = 1.0;
# Permission       : 755
# Date_written      : 2000/11/13
# Author         : 良寛
# E-mail         : ryokan@po.minc.ne.jp
# HomePage        : http://www.minc.ne.jp/~ryokan/
##################################################################
#
# -----注意事項---------------------------------------------------
# (1)このスクリプトはフリーソフトです。このスクリプトを使用した
# いかなる損害に対して作者は一切の責任を負いません。
# (2)設置に関する質問は質問コーナーにお願いいたします。
# ----------------------------------------------------------------
#

#=== 設定(ここから)=============================================

$count_data = "count.dat"; # データファイル
$zikan = 5;           # 同じ人がこの時間(分)内に
                 # 訪問してもカウントしない。
$lockkey = 1;          # ロックする = 1,しない = 0
$lockfile = "lock.dat";   # ロックファイル 
               # 存在すればカウント不可
#=== 設定終了(ここまで)=========================================


# ホスト名を取得
&get_host;

# カウント
&counter;

exit;


##################################################################
#******************** SUBROUTINE *******************************#
##################################################################

#=== カウント ==================================================

sub counter {

    ### ファイルロック(同時アクセスによるデータ破壊を防止)##
    if ( $lockkey == 1 ) {
      $lockflag = &lock;
    if ( $lockflag == 0 ){ push(@err,'BUSY'); &error; }
    }


    ### カウント処理 #########################################
    if(!open (IN,"$count_data")){
      push(@err,'count_data read error');
      &error;
    }
      $line = <IN>;
    close (IN);

    # 後ろの1文字(\n)を削除
    $line =~ s/\n$//;

    # つなぎ文字(|||)で$lineを分離
    ($count,$remote,$time1) = split(/\|\|\|/, $line);

    # 現在時刻
    $time2 = time;

    # 前回訪問時刻との差を計算
    $deftime = $time2 - $time1;

    # 現在の訪問者と前の訪問者が異なるか、あるいは
    # $zikan分経過のときはカウントする
    if ( $remote ne $rehost || $deftime > $zikan*60 ) {
      $count++;
      $line = "$count|||$rehost|||$time2";
      if (!open (OUT,">$count_data")){
        push(@err,'count_data write error');
        &error;
      }
      print OUT "$line\n";
      close (OUT);
    }


    ### ロックファイルの削除 #################################
    if ( $lockkey == 1 ) {
      if (-e $lockfile){ unlink($lockfile); }
    }


    ### 表示桁数をフォーマット(00234のように)し$counterに代入
    $counter = sprintf("%05d",$count);


    ### SSIの記述部分にカウンタを表示 ########################
    &ssi;

}


#=== ロックファイル ============================================

sub lock {

    local($flag) = 0;
    foreach(1..10){
      unless(-e $lockfile){
        open(LOCK,">$lockfile");
        close(LOCK);
        $flag = 1;
        last;
      }
      sleep(1);
    }
    $flag;

}


#=== ホスト名を取得 ============================================

sub get_host {

    $rehost = $ENV{'REMOTE_HOST'};
    $readdr = $ENV{'REMOTE_ADDR'};
    if ($rehost eq "" || $rehost eq "$readdr") {
      ($p1,$p2,$p3,$p4) = split(/\./,$readdr);
      $pack = pack("C4",$p1,$p2,$p3,$p4);
      $rehost = gethostbyaddr("$pack", 2);
      if ($rehost eq "") { $rehost = $readdr; }
    }

}


#=== SSI表示サブルーチン ====================================

sub ssi {

    print "Content-type: text/html\n\n";

    print "<html><head></head>\n";
    print "<body>\n";
    print "$counter\n";
    print "</body></html>\n";

}


#=== エラー表示サブルーチン ====================================

sub error {

    print "Content-type: text/html\n\n";

    print "<html><head></head>\n";
    print "<body>\n";
    print "ERROR<br>\n";
    foreach (@err){
      print "$_<br>\n";
    }
    print "</body></html>\n";
    exit;

}


 

[もくじへトップページへ次ページへ]