[もくじへ|トップページへ|次ページへ]
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;
}
|
[もくじへ|トップページへ|次ページへ]
|