この記事について
原著は 三河版 の三河人さんによる 「サルでも解る?!あめぞう型掲示板作成」 (初版 2001.07.18 / 最終更新 2006.06.04 / 解説:三河人&その他有志一同)です。
本ページはその構成と内容を引き継ぎ、靴スミが 2026 年時点の環境に合わせて書き起こした 引き継ぎ版です。原文そのものは上のリンクから読めます。素晴らしい記事を残してくださった 三河人さんに深く感謝します。
あわせて、配布元だった ame.x0.com が消滅してスクリプトが入手できなくなっていたため、
Internet Archive から一式をサルベージしてこのページで再配布しています。
あめぞう型掲示板スクリプト一式(UTF-8版)。 中身:amezo.cgi / dai.cgi / blist.txt / header.html / ng.txt / delpass.txt / .htaccess雛形 / README.txt / CHANGES.txt
個別に見る場合は ファイル一覧 からどうぞ (ブラウザ上ではソースがそのまま表示されます)。設置の手順は README.txt、原本からの変更点は CHANGES.txt にまとめてあります。
配布元だった ame.x0.com は既に消滅していたため、
Internet Archive から回収したスクリプトを土台に、靴スミが UTF-8 で
動くよう整備したものです。回収したオリジナル(Shift_JIS・無改変)も
original/ に保存してあります
(original/sapo-script.zip/
あめぞう(仮)が2000年に一時閉鎖する前の旧版は original/old/ に)。
再配布について
作者のサポート氏は「スクリプトを公開しているのであって配布はしていない。 ただし第三者が使用するにあたって制限は特に付けない」という立場を表明されていました。 本ページのミラーは、原本が失われた後のアーカイブ保全を目的としたもので、 スクリプト中の Copyright 表記は一切改変していません。 権利者の方からご連絡をいただければ速やかに取り下げます。
配布しているのは、靴スミが手を入れた UTF-8版 です。 オリジナルは Shift_JIS 専用でしたが、2026年に使うには不便なので、 UTF-8 で動くようにしたうえで、いくつかの改良を加えてあります。 エックスサーバー上のサブディレクトリに設置して、一通りの動作を 確認済みです(2026-08-30 / Perl 5.16)。原本からの変更点は CHANGES.txt に全て書いてあります。 掲示板としてのロジック(スレッド生成、レス、ヘッドライン、連投抑止)には 手を入れていません。
主な内容です。
Encode に置き換えたので、jcode.pl は不要
(新しい Perl で jcode.pl が動かない問題ごと解消)。バイト数前提だった題名の長さ判定や
投稿者名の切り詰めも、文字単位に直しています。ng.txt と delpass.txt は任意。
NGワードや削除機能を使わないなら、ファイルを置かなくてもエラーになりません。global.mem を自動で 600 に。投稿者IPの漏洩を防ぎます。charset と viewport を出すので、スマホでも読めます。amezo.cgi で書き換えるのは Perl のパスと
$urlbase の2箇所だけです。同梱の header.html は
素の雛形(原本のヘッダはリンク先が全部消えているため新規に用意)、
htaccess/ には charset 指定・global.mem 等の遮断・
キャッシュ対策を入れた .htaccess の雛形が入っています。
手順は README.txt にまとめてあります。
スレッドの削除機能について
削除の合言葉は、スクリプト本体ではなく別ファイル delpass.txt(web非公開)に
置く方式にしました。amezo.cgi は GET でソースが見える作りですが、
合言葉のハッシュは別ファイルにあり .htaccess で遮断されるので漏れません。
ハッシュ方式も、時代遅れの DES をやめて SHA-512 crypt に変えてあります。
delpass.txt が空(初期状態)のあいだは、削除機能は誰も使えません。
使いたい設置者だけが合言葉を設定します(手順は README.txt)。
元の作者のパスワードは削除済みです。
時は2000年9月。三河人さんが運営する「三河版」に、こんなスレッドが立ちました。
サルでも解る掲示板作 投稿者:あめざー歴3ヶ月の私 投稿日:09月13日(水)05時01分45秒
こんばんわー三河人さん初めまして。とある方からの紹介で来ました。私はあめざー歴3ヶ月(PC歴6ヶ月)の超素人です。こんな私にもあめぞうタイプの掲示板を作れるようになるでしょうか?CGIのCも解りませんが、なんとか頑張って作りたいと思ってます。
そこから生まれたのが「サル解」でした。当時 CGI を覚えて3ヶ月だったという三河人さんが、 戸惑いながら「いっちょ、やってみますか!」と書き始めた記事が、 その後20年以上にわたって、あめぞう型掲示板を立てたい人の教科書であり続けました。
原文の前置きには、こう書かれています。
「これを見ても全然解らない」「書いてある通りにやってみたけど動かない」と言って、すぐに「解らないから教えて」と聞きに来る方は、早々に設置を諦めてもらう方が良いと思います。ある程度の気力・自分で調べようとする心構えがある方でないと、総合掲示板の設置・運営は無理です。
これは2026年でも変わりません。むしろ、レンタル掲示板やSNSがいくらでもある今、 わざわざ25年前のPerlスクリプトを自分の鯖で動かそうという人は、 その気力がある人しかいないはずです。ようこそ。
原文では jcode.pl も必要とされていましたが、この版は日本語処理に
Perl 標準の Encode を使うので jcode.pl は要りません(同梱もしていません)。
転送ソフトは、原文では FFFTP が薦められていました。今なら WinSCP や FileZilla、
SSH が使えるならコマンドラインの scp / rsync でも構いません。
アップロードは必ずバイナリモード(または改行変換なし)で行ってください。
Perl スクリプトの改行が CRLF になると動かない鯖があります。
設置の前に、それぞれのファイルが何をしているかを掴んでおくと後がラクです。
あめぞう型掲示板の心臓部です。これ1本で以下をこなします。
index.html の生成(=表示は静的HTML。だから軽い)投稿があるたびに板の index.html を書き出してしまうので、
閲覧側は CGI をまったく叩きません。2000年前後の貧弱な鯖で
大量アクセスをさばくための設計です。そのぶん機能は最小限で、
改造の余地は狭くなっています。
各板の index.html から、<!-- HEAD LINE --> と
<!-- HEAD LINE END --> に挟まれた部分を最大20行だけ読んで並べる、というだけのスクリプトです。
本体側が静的HTMLにマーカーを埋めておくので、ヘッドラインの生成は
ファイルの部分読みだけで済みます。
なお、これを設置しなくても掲示板自体は動きます。
1行1板。カンマ区切りで次の3つを書きます。
[URL上の板名称],[板の背景色],[板の日本語名称]
実際にはこうなります。
main,#ddeedd,広場 geinou,#f2d8df,芸能 sapo,lightyellow,サポート削除依頼 .test,#ffffff,テスト
「URL上の板名称」はログが入るディレクトリ名そのものです。小技が2つあります。
.(ピリオド)を付けると、ヘッドラインに表示されなくなります。
ちょっとした隠し板が作れます(ただし blist.txt 自体が読めると結局バレます)。!画像ファイルのパス を足すと、板の背景に画像が出ます。
例:#fffff8!icho.gif掲示板の上半分(板リンク集と投稿フォーム)を作るHTMLです。
これを各板ディレクトリにコピーしたものが、そのまま最初の index.html になります。
つまり掲示板の見た目を変えたければ、まずここを触るということです。
1行1件、カンマ区切りで [NGワード],[オプション] と書きます。
オプションは 2003.12.01 以降の版で次の3通りです。
| オプション | 意味 |
|---|---|
n | 投稿者欄専用。一致するとリロード扱い(=投稿がなかったことになる) |
c | 本文欄専用。一致するとリロード扱い |
| (空) | 共通。投稿者欄・メール欄・本文欄の一致した部分だけを削って投稿 |
例えば ng.txt がこうだった場合、
えろえろ, モナー,n
※さらに古い版ではオプションが -(投稿者欄専用)の1種類だけでした。
原文ではバーチャルアベニューや isweb(旧freeweb)といった無料鯖が紹介されていましたが、 いずれも今は存在しません。2026年現在の要件は次のとおりです。
国内の共用レンタルサーバ(エックスサーバー、さくらのレンタルサーバ、ロリポップ!など)なら だいたい条件を満たします。VPS や自宅サーバなら言うまでもなく自由です。 靴スミが動かしている掲示板も、エックスサーバー上のサポートスクリプト系です。
Perl のパスは鯖によって違います。大半は /usr/bin/perl か
/usr/local/bin/perl のどちらかです。SSH が使えるなら
which perl で一発で分かります。
CGI の置き場所に制限がない、ふつうのレンタルサーバの場合はこうなります。 括弧内はパーミッションです。
[public_html] (755)
├ .htaccess (644) ← htaccess/cgi-htaccess.txt
├ amezo.cgi (755)
├ dai.cgi (755)
├ blist.txt (644)
├ header.html (644)
├ ng.txt (400) ※任意(NGワードを使うなら)
├ delpass.txt (400) ※任意(削除機能を使うなら)
├ global.mem (600) ※自動生成される
│
├ [main] (755)
│ ├ .htaccess (644) ← htaccess/board-htaccess.txt
│ ├ index.html (644)
│ └ index2.html (644)
│
├ [main2] (755)
│ ...
└ [sapo] (755)
CGI を cgi-bin 配下に置けと言われる鯖なら、
amezo.cgi 以下の一式をまるごと cgi-bin の中に入れ、
板のディレクトリもその下に作ります。板だけを別の場所に置きたい場合は
■5 の header.html の変更が必要です。
スクリプト本体でいじるのは 2箇所だけです。あとは板まわりの設定になります。 エディタは、文字コードを UTF-8(BOMなし)のまま、改行を LF のまま保存できるもの (サクラエディタ、秀丸、VS Code など)を使ってください。 手順は同梱の README.txt にも同じものが書いてあります。
#!/usr/bin/perl
設置先の鯖に合わせて書き換えます。/usr/local/bin/perl のこともあります。
$urlbase = 'http://ame.x0.com/';
ここを自分の掲示板のURLに変えます。掲示板が https://example.jp/bbs/ なら、
$urlbase = 'https://example.jp/bbs/';
末尾のスラッシュを忘れないでください。ついでに、その下にある
$amezo(掲示板の名前)と $admin(管理人名)も好きに変えて構いません。
同梱の blist.txt は3板ぶんの雛形です。書式は■2のとおりで、
ここに書いた板名が、そのまま作るディレクトリの名前になります。
先頭の板リンクを blist.txt の内容に合わせて書き換えます。
同梱の header.html は素の雛形なので、掲示板の見た目もここで作り込んでください。
板とCGIの位置関係が標準(板の親ディレクトリに amezo.cgi がある)でない場合は、
24行目の投稿フォームの action も、板ディレクトリから見た相対パスに直します。
<form method=post action="../amezo.cgi">
header.html をコピーして、各板ディレクトリの中に
index.html と index2.html という名前で置きます。中身は変えなくて結構です。
この版では、どちらも置かなくて構いません。
NGワードを使うなら ng.txt を、スレッドの削除機能を使うなら
delpass.txt に合言葉のハッシュを入れて置きます
(ハッシュの作り方は README.txt に書いてあります)。
main ひとつで構いません。amezo.cgi / dai.cgi / blist.txt /
header.html をアップロードする。NGワードや削除機能を使うなら
ng.txt / delpass.txt も。index.html と index2.html を置く。htaccess/ の雛形を .htaccess という名前で置く。
cgi-htaccess.txt は CGI と同じディレクトリに、
board-htaccess.txt は各板ディレクトリに。SSH が使えるなら、まとめてこれだけです。
chmod 755 amezo.cgi dai.cgi chmod 644 blist.txt header.html .htaccess chmod 400 ng.txt delpass.txt # 置いた場合だけ chmod 755 main chmod 644 main/index.html main/index2.html main/.htaccess
掲示板のURLにブラウザでアクセスします。https://example.jp/bbs/ に置いたなら、
https://example.jp/bbs/main/
板の一覧と投稿フォームが出てきましたか?
出てこない場合は index.html が置けていないか、URLが違います。
画面が出たら、いちばん下にある「リロード」ボタンだけをポチッと押してください。
背景色が blist.txt で指定した色に変わり、板のタイトルが日本語名に書き換われば成功です。
あとはお好きなだけスレッドを立てて堪能してください。一国の主です。
うまくいかないときの見どころ:
| 症状 | だいたいの原因 |
|---|---|
| Internal Server Error (500) | 1行目のPerlパスが違う/改行がCRLFになっている/amezo.cgiのパーミッションが755でない |
| 画面は出るがリロードで何も変わらない | 板ディレクトリが755でない/index.htmlが644でない(=CGIが書き込めない) |
| リンク先が全部404 | $urlbase の書き間違い。末尾のスラッシュ忘れが多い |
| 投稿すると文字化けする | ファイルを UTF-8(BOMなし)以外で保存した/転送ソフトが文字コードを変換した。バイナリモードで上げ直す |
| 投稿すると「不正なリクエストです」 | $urlbase と実際にアクセスしているURLが食い違っている(http と https、ドメイン違いなど) |
| 投稿しても画面が変わらない | ブラウザのキャッシュ。板ディレクトリに board-htaccess.txt を .htaccess として置く |
それでは、良い『あめぞうライフ』を!
ここからは原文にはない、靴スミからの補足です。25年前のスクリプトを今の環境に載せると、 いくつか引っかかる点があります。
原本に同梱の jcode.pl は 2.10(1999年)で、641行目と648行目に
defined %hash という書き方が残っています。これは Perl 5.16 で非推奨、
Perl 5.22 以降では文法エラーになります。エラーが出たら defined を外すだけで直ります。
(UTF-8版では jcode.pl 自体を使わないので、この問題は起きません)
641: &init_z2h_euc unless defined %z2h_euc; → unless %z2h_euc; 648: &init_z2h_sjis unless defined %z2h_sjis; → unless %z2h_sjis;
なお amezo.cgi と dai.cgi 自体は、現代の Perl でも
perl -c が素通りします。
※この版は amezo.cgi が自動で global.mem を 600 にし、
同梱の .htaccess でも遮断しているので対処済みです。以下は仕組みの説明と、原本を使う場合の話です。
原文の 2004.12.28 の追記にもあるとおり、global.mem が web から読める状態だと、
直前にスレッドを立てた人のIPアドレスが誰でも見られます。対処はどちらかです。
global.mem を 600 にする(1回でOK)amezo.cgi の末尾、close(Z); の直後に1行足す(こちらが確実) for (keys %iplist){
print Z "$_ $iplist{$_}\n";
}
close(Z);
chmod 0600,"global.mem"; ←この1行を追加
}
加えて、.htaccess でも塞いでおくと安心です。
<Files "global.mem">
Require all denied
</Files>
<Files "ng.txt">
Require all denied
</Files>
今どき http のままだと、ブラウザに警告を出されるうえ投稿内容が平文で流れます。
サーバ側で常時SSLを有効にし、$urlbase も https:// で書いてください。
既にログを溜めてしまった後なら、生成済みの index.html 内のURLを
sed などで一括置換する必要があります。
原本(original/ の Shift_JIS 版)は、jcode.pl で入力を
Shift_JIS に寄せてから HTML を書き出します。そちらをそのまま動かすなら、生成されるHTMLに
<meta charset="Shift_JIS"> 相当が入っているか
(=header.html にあるか)を確認してください。
入っていないと、charset を推測しないモダンなブラウザで文字化けします。
このページで配布しているのは UTF-8版 で、そのあたりの面倒はありません。 これから立てるなら、そちらをどうぞ。すでに Shift_JIS で運用している板を移行する場合は、 スクリプトの差し替えに加えて既存ログの一括変換が要ります。 靴スミの掲示板も実際にこれをやりました。
公開したまま放置すると、まず間違いなく自動投稿にやられます。
スクリプトが持っているのは「同一IPから180秒以内の連続スレ立て禁止」と
「板ごとに5秒の連投抑止」と ng.txt だけで、
これは2026年のボットには何の効果もありません。
ng.txt にURLパターンなどを仕込む(最低限)あめぞう型掲示板の XSS といえば「あめぞうウィルス」です。メール欄に
<script> タグを仕込んだ投稿が置かれ、その板を開いた閲覧者のブラウザで
スクリプトが走って、閲覧者自身の投稿によってさらに増殖していきました。
サポートスクリプトは 2000年の版から入力の & " < > を
エスケープしていて、この穴自体は塞がっています。この版では
さらに ' も足して属性の中でも抜け出せないようにし、
URL自動リンクは https?: 限定で rel="noopener noreferrer nofollow" を付与、
folder パラメータのパストラバーサルも禁止しました
(詳細は CHANGES.txt [13])。
CSRF も、既存の referer チェックに加えて Origin ヘッダ検証を足し、
他サイトのフォームからの投稿を弾くようにしました
(Origin を送らないブラウザでは従来どおり referer に委ねます)。
とはいえ元が 1999〜2003年のスクリプトである以上、過信は禁物です。 公開運用するなら中身を読み、(e) のスパム対策とあわせて、 自分で手を入れられる人が使ってください。
amezo.cgi は冒頭で REQUEST_METHOD が GET のとき自分自身を
text/plain で吐き出す作りになっており、dai.cgi も
QUERY_STRING が空でなければ同様にソースを出力します。
おかげで Internet Archive のクローラが、実行結果ではなくソースそのものを
保存していました。ただし dai.cgi のソースは ?get 付きの
2005-02-06 のたった1件しか残っていませんでした。
なお ng.txt は本家がパーミッション 400 で非公開だったため回収できず、
配布物では空にしてあります(この版では無くても動きます)。
Wayback に残っていた各版を並べて差分を取ったものです。 自分で改造するときの参考にどうぞ。
| 版 | 主な変更 |
|---|---|
| 2000-05-10 Copyright 1999-2000 |
旧サポートスクリプト。NGワードは ng.txt ではなく、特定の人名がスクリプトに直接書き込まれていた |
| 2001-04-05 Copyright 1999-2001 |
配布元が www17.big.or.jp/~amezo_/ から ame.x0.com へ移転。ng.txt 方式を導入。削除用パスワードの crypt が MD5 crypt に |
| 2002-10-01 | NGオプションが - の1種類から n/c の2種類に拡張。題名の長さチェック。日付表示が4桁年に。同一IPから180秒の連続スレ立て抑止(&check)を追加 |
| 2004-06-09 Copyright 1999-2003 |
投稿者名を60文字に制限。多重引用符の圧縮。板ごとの lasttime.txt による5秒の連投抑止を追加 |
| 2007-11-11 | 制御文字の除去。題名から空白・全角空白・_ を除去。NG判定をURLデコード後の本文に対して行うよう修正。これが最終版 |
原著者の三河人さんと、当時この記事を作り上げた有志のみなさんに感謝します。 20年以上ネットに置き続けてくださったおかげで、この文章も書けました。
スクリプトの作者はサポート氏(@あめぞう(仮)管理人)です。 使用にあたっての制限は特に設けられていませんが、 「Copyright を改変しないこと」だけは礼儀として守ってください。
<!--
Script for amezo-like BBS
Copyright (C) 1999-2003 amezo_
http://www17.big.or.jp/~amezo_/
http://ame.x0.com/
-->
独自に改造した場合も、この部分は上書きせず、追記する形にしてください。
このページに関するご意見・ご指摘は 速報@靴屋 までどうぞ。
スクリプト一式は Internet Archive Wayback Machine より 2026-08-30 に回収しました。