#!/usr/local/bin/perl
# 存在しないファイル、公開していないファイルなどにアクセスが
# あったときに実行される CGI。
#
# エラーが起こった場合この CGI スクリプトが実行されるように
# .htaccess を設定しておく必要がある。
#
# $Id: error.cgi,v 1.13 2005/07/06 14:35:47 68user Exp $
use strict;
my $cvsid = '$Id: error.cgi,v 1.13 2005/07/06 14:35:47 68user Exp $';
my $mailaddr = '68user@X68000.startshop.co.jp';
my $base_uri = 'http://X68000.q-e-d.net/~68user';
my @cgi_ext = ("cgi");
#-----------
use vars qw($whoami);
require 'environment.pl';
#----------
my $error_code = $ENV{REDIRECT_STATUS};
my $you = `$whoami`;
my $host = $ENV{REMOTE_HOST} || $ENV{REMOTE_ADDR};
#---------
# 外部から設定可能な変数
my $myhost = $ENV{HTTP_HOST};
$myhost =~ s/[^a-zA-Z0-9\.\-]//g;
my $correcthost = 'X68000.q-e-d.net';
my $uri = $ENV{REQUEST_URI};
my $org_uri = $uri;
$uri =~ s/</g;
$uri =~ s/>/>/g;
$org_uri =~ s/[\r\n]//g;
my $referer = $ENV{HTTP_REFERER};
$referer =~ s/[\r\n]//g;
my $title;
my $reason;
my $more_reason;
if ( $ENV{QUERY_STRING} eq 'badhostname' ){
$title = "Bad Hostname";
$reason = "ホスト名 ($myhost) が不正です。";
$more_reason = "http://$myhost$uri のホスト名が不正です。";
$more_reason .= "正しい URL は http://$correcthost$uri と推測されます。";
} elsif ( $error_code eq "500" ){
$title = "500 Internal Server Error";
$reason = "内部エラーが起こりました。";
$more_reason = "http://$myhost$uri の実行ができませんでした。";
$more_reason .= "おそらくCGIプログラムの不具合が原因です。";
} elsif ( $error_code eq "404" ){
$title = "404 not found";
$reason = "ファイルが見付かりませんでした。";
$more_reason = "http://$myhost$uri というファイルは存在しません。";
$more_reason .= "誤った URL が入力されたか、こちらのリンクミスと思われます。";
} elsif ( $error_code eq "403" ){
$title = "403 Forbidden";
$reason = "実行/閲覧に必要な権限がありませんでした。";
my $cgi_ext = join("|",@cgi_ext);
if ( $uri =~ m|/$| ){ # ディレクトリなら
$more_reason = "$uriディレクトリの一覧は見ることができませんのでご了承ください。";
} elsif ( $uri =~ m|\.($cgi_ext)$| ){ # CGIなら
$more_reason = "
$youは$uriを実行する権限がありません。";
$more_reason .= "
不正な URL が入力されたか、こちらの設定ミスでしょう。";
} else { # 通常ファイルなら
$more_reason = "
$youは$uriを読み込む権限がありません。";
$more_reason .= "
\n";
$more_reason .= "- ログファイル (*.log) は HTTP 経由では参照できないようにしてあります。";
$more_reason .= "
- emacs のバックアップファイル (*~) は HTTP 経由では参照できないようにしてあります。";
$more_reason .= "
- 全文検索のデータ(の一部)はあまりにもファイルサイズが大きいので、";
$more_reason .= "HTTP 経由では参照できないようにしてあります。";
$more_reason .= "
\n";
$more_reason .= "誤った URL が入力されたか、こちらの設定ミスと思われます。";
}
} else {
&put_header("error.cgi", 'EUC-JP');
print "直接 error.cgi を実行しても意味がありませんよ。";
&myfinish;
# unreached
}
&put_header($title, 'EUC-JP');
&put_message;
my $date = &get_date;
&lock_on;
open(LOG,">> ../log/error.log") || exit;
print LOG "$date $host $error_code $org_uri $referer\n";
close(LOG);
&lock_off;
&myfinish;
# unreached
#-------------------------------------------------------------------------------------------
sub myfinish {
print "
$cvsid
\n";
print "