POTI-boardのエラーを減らすために header編

headerのWarningを検証するため、正常に動作するとgoogleが表示されるように該当箇所を書き換えてみました。
// header("Content-type: text/html; charset=".CHARSET_HTML);
header("Location: http://google.com/");
XAMPPでphpのエラー表示ありで試してみると…。
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\hoge\potiboard.php:459) in C:\xampp\htdocs\hoge\potiboard.php on line 1123
になり、googleに推移しません。
しかし、phpのエラーを表示しない設定のサーバ上ではgoogleに推移します。
Warning: Cannot modify header information
というWarningがほかにも出ていましたが、headerの出力の前にNoticeが表示された事が原因でした。

お絵かき掲示板で描いた水着のイラスト 8枚

お絵かき掲示板 水着お絵かき掲示板 水着お絵かき掲示板 水着お絵かき掲示板 水着お絵かき掲示板 水着お絵かき掲示板 水着お絵かき掲示板 水着お絵かき掲示板 水着
お絵かき掲示板で描いた、水着少女のイラスト8枚。私が描いたイラストをみてこんな形のビキニがお絵かき掲示板で話題になったりしたとかしないとか…。
スマートフォンでも描けるお絵かき掲示板だとgoogleの検索でわかるようにメタタグを書いたからなのか…。
新しい方のからの投稿が…。
投稿してくれる方が増えないかなとか、自分で絵板を設置する方が増えたらいいなとか、そんな事を考えながら。

ペイントソフトで描いたらくがき20枚

Painter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang PaintPainter CLIP STUDIO PAINT MediBang Paint
カテゴリーをオリジナル…にと思いましたが、写真を参考にして描いたものが入っているのにオリジナルにしてしまうのは…という事で便宜的にPainterに。

主に使っているソフトがPainterなのは確かなのですが…MediBang PaintやCLIP STUDIO PAINTも使っていて3つのソフトを全部使って描く事もあります。

twitterや、pixivで観てくれている方はいても、ブログに絵を観に来る方はほとんどいないのが現状…ですけどね。
たしか、自分のイラストを掲載するブログだったという事で…。
posted by さとぴあ at 2018/05/06 14:34 | Painter

POTI-boardのログファイルの上限を5MBに

簡単なテストしかできていないため、各自自己責任で…。
ぷち的ココロ♪

総レス数がまだ2800を超えた程度なのに、親記事のナンバーの低いスレが消えてしまっていました。
親記事ナンバー+5000レスをスレの消える寿命に設定するにはどうしたらいいのでしょうか?

バッファに1000000byte読み込む処理があったので
logファイルの上限がおそらく約1Mbyteだと思います。
その上限を超えたので2800でレスが消えたのではないでしょうか
調べてみると…。

$buf=fread($fp,1000000);
となっているところが7箇所
$buf=fread($tp,1000000);
1箇所

合計8箇所にログファイルに関するものと思われる1000000byteの指定がありました。
試しにここを

$buf=fread($fp,2000000);

つまり2倍にしてみたところ

POTI-boardのログファイルの上限

1.961kbまでログを保存する事ができるようになりました。

XAMPPでテストしたので、ログファイルのファイルサイズの確認がエクスプローラーになりましたが…。
2000000byte=1953kbなのでだいたいあってますね…。

XAMPPの次は、さくらのレンタルサーバで5MB保存できるかテスト。

$buf=fread($fp,5242880);
$buf=fread($tp,5242880);

に設定。

POTI-boardのログファイルの上限POTI-boardのログファイルの上限

テキストファイルのサイズが1MB〜3MBのものを数回投稿。
数発言で5MBを超える投稿を行ってみたところ…。

9601969byte…。
5MBを超えてしまいました。

ログファイルが4MBの時に、1発言5MBの投稿を行うと4+5=9MBとなるようです。
追加で短く一言書いてみると…。

5242824byte=4.999946594MBになりました。

$buf=fread($fp,5242880);
$buf=fread($tp,5242880);

この2つは、ログファイルを読み込む時の設定…なんでしょうね。
5MBしか読み込まなかったので9MBあったログが5MBに…。

ログファイルがどうなっているのか調べてみたところ、コメントが途中で切れて必要なログの形式もなくなっていました。
スレッドやレス単位ではなくファイルサイズの上限で切れるようです。

他のログはどうなるのかというと…。
途中で切れてしまったログ以外は問題なさそうな感じでした。

POTI-boardのログファイルの上限

ログファイルをダウンロードしてファイルサイズを確認してみたところ…。
ぴったり5MB…。

ログが5MBまで溜まった状態で書き込むと5MB読み込む処理が入る…。どの程度の負荷になるのかよくわからないのですが…。
5MBだと大きすぎるのかもしれないので…。

$buf=fread($fp,2097152);
$buf=fread($tp,2097152);

2MBなら…。どうなんでしょうね…。

お絵かき掲示板はこちら。

P.S
POTI-board改 v1.45.5 lot.181129で、2MBになりました。

POTI-boardの頁リンクが増え続けるのを制御(その2)

POTI-boardの現在の仕様だと、300ページ分ログがあると、300ページ全部表示してしまうので、長く運用してログをストックしていくタイプの掲示板だと厳しい…。

だから、最新から19ページまでは古いログを表示しない、20ページになったら、21ページ以後のページがすべて表示される。20ページ分のログが存在しない時は、存在しているログの分だけ表示するようにプログラムを書き直して終わり…の筈だったのですが。

それだとログが20ページまでしか存在していないと思う人がでてくるという指摘がありました。

ログが21ページ分より多くかつ最新から20ページまで表示している時は、21ページを
[0][1][2](中略)[20][>>]
のように表示する事ができれば…。

直接テンプレートに[>>]といれて、21ページへのリンクを貼る事もできますが…。
それだと…ログファイルが少ない時と多い時とでテンプレートを書き直さなければならなくなるのでプログラムで対応したい…と思いました。

POTI-board

こんな感じになりました。
//下段ページリンクの出力をifで分岐
//0-21まで表示する事を想定
//カウントツリーが指定した数値より小さい場合は全件表示

if(220 > count($tree)){
for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}

//下段ページリンクの出力をifで分岐
//スレッド数が指定した数値より大きな時は全件表示
//数値を-1小さく設定しないとリンクが表示されないページができるかも。

elseif($i > 219 ){
for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}

//下段ページリンクの出力をifで分岐
//スレッド数が指定した数値より小さい時は任意の数値でページを表示

elseif($i < 220 ){
for($i = 0; $i < 220 ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
if($i==210){
$pno = str_replace("<PAGE>", ">>", OTHER_PAGE);
// $pformat = str_replace("<PURL>", PHP_SELF2, $pno);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}}
$paging.=$pformat;
}
}
//ここまで
21ページ目なら、[>>]にという記述が増えただけなんですけどね。
ページ番号20を表示させたかったので、ひとつ前の記事で書いたものより、+10スレッド数が多くなっています。
1ページ10件表示用なので、例えば5件表示で使うと [>>] が横並びの最後にならず、ひとつ手前に出てしまいます。

お絵かき掲示板はこちら。

POTI-boardの頁リンクが増え続けるのを制御

POTI-boardは、1ページ10件表示で3000スレッドあったら300ページ分のリンクができる仕様…。

しかし、そんなに多くの古いログを見たい訳ではない時のほうが多いので…。
テンプレートで最初の20件だけ表示して、あとは頁へのリンク無しでもいいか…と思いましたが、それはそれで、古いログを見る時に…。

というわけで、以下の仕様になるようにPOTI-boardを改造してみました。

0から19ページまでは、
ページ番号0から20(0から20なので210スレッド分)までしか表示しない。
20ページになったら21ページ以後も表示。
3000スレッドあったら300ページ表示。
また、スレッドが210件未満の時は、存在しないページへのリンクができないように最初の条件分岐でログのカウントツリーをチェックして全件表示。
その場合は210スレッド未満なので、20ページ以下になります。

POTI-board

0-20ページまで表示。

POTI-board

20ページ以後を表示しているので、0-21ページまで表示。
もし300ページ分ログがあれば、0-300ページまで表示。

プログラムを書き換えた箇所
// for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
// if($st==$i){
// $pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
// }else{
// if($i==0){
// $pno = str_replace("<PAGE>", "0", OTHER_PAGE);
// $pformat = str_replace("<PURL>", PHP_SELF2, $pno);
// }else{
// $pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
// $pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
// }
// }
// $paging.=$pformat;
// }

コメントアウトしてあります。
//下段ページリンクの出力をifで分岐
//0-20まで表示する事を想定
//カウントツリーが指定した数値より小さい場合は全件表示

if(210 > count($tree)){
for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}

//スレッド数が指定した数値より大きな時は全件表示
//数値を-1小さく設定しないとリンクが表示されないページができるかも

elseif($i > 209 ){
for($i = 0; $i < count($tree) ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}

//スレッド数が指定した数値より小さい時は任意の数値でページを表示

elseif($i < 210 ){
for($i = 0; $i < 210 ; $i+=PAGE_DEF){
if($st==$i){
$pformat = str_replace("<PAGE>", $i/PAGE_DEF, NOW_PAGE);
}else{
if($i==0){
$pno = str_replace("<PAGE>", "0", OTHER_PAGE);
$pformat = str_replace("<PURL>", PHP_SELF2, $pno);
}else{
$pno = str_replace("<PAGE>", $i/PAGE_DEF, OTHER_PAGE);
$pformat = str_replace("<PURL>", ($i/PAGE_DEF).PHP_EXT, $pno);
}
}
$paging.=$pformat;
}
}
//ここまで

書き換えた内容。

ちゃんとプログラムが書ける人なら、スマートにまとめる事ができる筈なのですが…。
とりあえず動いているからいいか…という…。

まともにプログラムが書ける方が見たら、うわっ…というプログラムになっていますのでご注意ください。
カタログページも対応させる場合は、該当箇所を同じように分岐させる事になります。

お絵かき掲示板はこちら。

合作ができるようにPOTI-boardを改造しました

BBSNoteや、relmには、新規投稿ならパスワードがなくても続きを描く事ができる機能があります。合作の時に使う機能です。
もとの投稿を編集・削除する時はパスワードが必要なので、第三者による編集・削除を防ぐ事ができます。

POTI-boardでも似たような事ができるんだろうな…と思ったのですが…。

POTI-board 続きから描くPOTI-board 続きから描く
//コンティニュー時、削除キーを必要とする 必要:1 不要:0
define('CONTINUE_PASS', '0');
に設定すると、削除キーの入力欄が無くなり誰でも続きを描く事ができるようになりました。
しかし…。

POTI-board 続きから描くPOTI-board 続きから描く

差し換えなのにパスワードが無くても続きが描けるのはおかしい…と思ったら投稿エラーになりました。
これでエラーにならなかったら、知らないうちに投稿したイラストが別の何かになっていてもおかしくない…。

POTI-board 続きから描く

エラーになった画像が、アップロード途中の画像に残っていました。
コメントを入力すれば新規投稿になります。

という事は、削除キーがなくても続きを描く事ができる設定にすると、続きを描いて差し換える事ができなくなる仕様…という事になります。

投稿したあとでちょっとだけ直したくなった…という事があるので困ります。

差し換えと新規投稿で、異なる動作になるようにプログラムを書き変える事ができれば…。
//コンティニュー時のパスワード
// if(CONTINUE_PASS) usrchk($no,$pwd);
//パスワードが必要なのは差し換えの時だけ
if($type=='rep') usrchk($no,$pwd);
思ったより簡単だったというか…。差し換えの時はパスワードをチェックするけど、それ以外はパスワードをチェックしない。
新規投稿ならパスワードなしで、差し換えならパスワードが必要。
ここを書き直すだけで期待通りの動作をするようになりました。

ただし、削除キー不要の設定のところを、必要にしないと削除キーの入力欄が表示されなくなりますから、必要にしておかなければいけません。

config.phpで設定できるようにしてみました。
テンプレートの仕様変更も…。従来のテンプレートでも対応テンプレートで改造前のプログラムでもどちらでも問題がでないように何とか…。

config.php
//コンティニュー時、削除キーを必要とする 必要:1 不要:0
define('CONTINUE_PASS', '1');
の設定をそのまま使います。
説明文だけ変更して
//新規投稿でコンティニューする時にも削除キーが必要 必要:1 不要:0
define('CONTINUE_PASS', '0');
potiboard.phpの
1855行目付近
// if(CONTINUE_PASS) $dat['passflag'] = true;
//コンティニュー時はパスワード欄を常に表示
//従来のテンプレートとの互換性を保つため
//passflag を常に true にする。
$dat['passflag'] = true;
//ペイント画面のテンプレートで使う変数を追加
//新規投稿でパスワード不要の時 true
if(! CONTINUE_PASS) $dat['newpost_nopassword'] = true;
2680行目付近。
case 'contpaint':
//コンティニュー時のパスワード
// if(CONTINUE_PASS) usrchk($no,$pwd);
//パスワードが必要なのは差し換えの時だけ
if(CONTINUE_PASS||$type=='rep') usrchk($no,$pwd);
CONTINUE_PASSが 1 または、差し換えの時はパスワードが必要→差し換えでも、新規投稿でもパスワードが必要。

CONTINUE_PASSが 0 なら、パスワードが必要なのは差し換えの時だけになるので、新規投稿を選択すれば誰でもパスワード無しで続きを描く事ができる→合作可能。

お絵かき テンプレート
<!--{def newpost_nopassword}-->
<li>新規投稿なら削除キーがなくても続きを描く事ができます。</li>
<!--{/def}-->
<!--{ndef newpost_nopassword}-->
<li>続きを描くには描いたときの削除キーが必要です。</li>
<!--{/ndef}-->
従来のテンプレートを使う場合は
// passflag…削除キー入力を促す場合 true が入る
の箇所が、常に true となるので、
<li>続きを描くには描いたときの削除キーが必要です。</li>
という表示になる。

続きから描く時の挙動が、POTI-board、BBSNote、relmですべて同じになり設置しているすべてのお絵かき掲示板で合作が可能になりました。

P.S
この仕様はPOTI-board改 v1.42 lot.180507に組み込まれました。

コメントスパム対策のための.htaccess POTI-board用

長い間、掲示板へのコメントスパムをcgiの設定で防いで来ました。
「半角英数のみの投稿を許可しない」「NGワード機能を使用」「特定のIPをアクセスできないようにする」
BBSNotev8.0b19のモジュール、filter.cgi、ngword.cgi、security.cgiでフィルタリング。
それで十分…と思っていましたがBBSNoteはPerl5.12以上では動作しない事がわかり…。

他の掲示板には、BBSNoteのモジュールのような機能があるような、無いような…。
.htaccessによるアクセス制御 – さくらのサポート情報

特定のドメイン名やIPアドレスからの閲覧を【拒否】したい
設定ファイルの作成

メモ帳等のテキストエディタで、設定ファイルを作ります。

Order allow,deny
allow from all
deny from remote.host.com
deny from 192.168.0.
home/cgi/ のようなディレクトリ構成で、複数ある掲示板は cgi/ 以下にしか無いのであれば、cgiというディレクトリに.htaccessを設置すれば、cgi/ 以下の下位ディレクトリすべてへのアクセスを許可したり拒否したりできますから、掲示板が10種類あってもまとめて制御する事ができます。

こっちのほうが簡単…という事で.htaccessによる掲示板へのアクセス制限を使い始めて、約1年…。

コメントスパムのIPアドレス、ホスト名の記録を15年近く続けていましたから、それを.htaccessで拒否するように設定しました。
今のところコメントスパムを排除する事に成功しています。

しかし、拒否しなくてもいい人まで拒否してしまっている可能性も…。
登録しているIPアドレスが古すぎて、日本国内のIPアドレスになっていたら?
定期的に調べ直さなければならないのかもしれません。
それでも蓄積したブラックリストがあるのなら公開して欲しいという方のために、6800行あるファイルから必要最小限のものをピックアップしてzipファイルにまとめてみました。

POTI-boardと同じディレクトリに設置する事を想定したものですから、その他の掲示板にはそのままでは使えないかもしれません。

HTMLファイルをキャッシュさせないようにする設定と、POTI-boardの設定ファイルとログファイルへのアクセスを拒否する設定も入っているからです。

.htaccessの中を見て、何が書いてあるのかわかる方なら、IP、ホスト名だけコピペしていただければ…。
order allow,deny
allow from all

deny from .ru
deny from .ua
deny from .broadband.kyivstar.net
コメントスパムで埋まったお絵かき掲示板の投稿者のIP、ホストを調べてみた限りでは…。
.ua
.ru
.broadband.kyivstar.net
の3つを拒否するだけで海外からのコメントスパムの大半は拒否できるような気がします…。

配布するファイルにはもうちょっといろいろ入れてあります。

zipファイルには別の.htaccessも入れておきましたが…。
そのまま使うのは危険です。

何名かの国内の友人、そして全世界の友人を失っても構わない、とにかく海外からのコメントスパムを防ぎたい…という方のための設定になっています。
#phpファイルにアクセスできるのは.jpと.bbtec.netだけ
#そのほかの国内からのアクセスも弾いてしまうので
#実際に運用する場合は
#http://www.cgis.biz/tools/access/
#の日本国外からのアクセスを制限する.htaccessの内容を以下に追加

<Files ~ "\.php$">
order deny,allow
deny from all
allow from .jp
allow from .bbtec.net
</files>
海外からでも掲示板の投稿を読む事ができて、イラストを見る事もできるように、拡張子.phpのファイルへのアクセスだけ拒否するように設定してみました。
.jp
.bbtec.net
からのアクセスしか許可しない設定になりますから、学校の施設からアクセスしたら拒否されたとか…、国内で使っているけれど回線は米国の場合は書き込む事ができなくなります。
アクセス制限のかかっていない領域にメールフォームを設置して、書き込めないから許可する設定にしてください…という連絡をもらって許可するIP、ホストを追加していけばいいのかもしれませんが…。
IPアドレスで日本国外(海外/外国)からのアクセスを制限する.htaccess CGI's
ここから.htaccessをダウンロードして、そのまま設置すれば、国内からしかアクセスできなくなる筈なので、こんな小さな個人サイトのブログが配布しているファイルよりよほど確実かもしれません。

しかし、日本以外からのアクセスを禁止するという事はGoogleからのアクセスも禁止する事になるようなので、いつまでたってもGoogleの検索結果に反映されないといった問題が起きるかもしれません。

アクセス制限は、できるだけ狭い範囲にかけるものだと思っています…。
たとえば、ただのHTMLファイルへのアクセスはできるけれど、掲示板の拡張子、cgi、phpにアクセスできるのは日本国内からだけといった設定をする事もできます。
上位ディレクトリへの設置ではなく、掲示板が設置されているディレクトリに設置すれば、掲示板以外へのアクセスは制限されないのでトップページも見る事ができないといった問題を回避する事ができると思います。
htaccess_for_POTI_board_181425.zip
二種類の.htaccessが入っています。あくまでもサンプルです。
実際に運用する場合は、記述されている内容をご自身で確認してくださいますようお願い致します。
また、サーバによってはうまく動作しないかもしれません。
そういった事も含めて、あくまでもサンプルであり無保証です。

お絵かき掲示板のキャッシュを.htaccessで制御

お絵かき掲示板、POTI-boardは投稿後の画面をHTMLファイルで表示します。
そのため、更新される前のキャッシュを表示する事があります。
Ctrl+R、F5、またはブラウザの更新のアイコンをクリックすれば、投稿したコメントやイラストが表示されるので問題ないといえば問題ないのですが…。
ちょっと面倒…というか…。
どうにかならないのかな?と思って調べてみると…。
HTML5における no-cache - Qiita

本記事の投稿当時に紹介したアプリケーションキャッシュは、現在では廃止予定の機能となりました。
HTML5でもキャッシュを制御する方法が…と思ったら廃止…。その代わりになるものは?
サービスワーカーの使用 - Web API インターフェイス | MDN

コードは HTTPS を通して提供する必要があります。サービスワーカーはセキュリティ上の理由から HTTPS を通して実行されるよう制限されています。
どのようにすれば使う事ができるのか、よくわからない上、HTTPS…。
.htaccess の書き方(アクセス制御編) - Qiita

キャッシュの有効期限を過去にする
<Files ~ "\.html?$">
<IfModule mod_headers.c>
Header set Pragma no-cache
Header set Cache-Control no-cache
Header set Expires "Thu, 01 Dec 1994 16:00:00 GMT"
</IfModule>
</Files>
Qiitaの記事を参考に拡張子 .html または .htm のファイルのキャシュの有効期限を
Thu, 01 Dec 1994 16:00:00 GMT に設定。

POTI-board

デベロッパーツールでHTMLファイルのキャッシュの有効期限を確認。
Expires: Thu, 01 Dec 1994 16:00:00 GMT
リロードしなくても反映されるようになりました。
キャッシュしないファイルはHTMLだけで、ファイルサイズが大きな画像はキャッシュしますから表示速度への影響も最小限…だと思います。

relm

続きを描いた筈なのに以前の画像のまま…というトラブルが発生していたrelmのための設定。
<Files ~ "\.(html?|jpg|png)$">
<IfModule mod_headers.c>
Header set Pragma no-cache
Header set Cache-Control no-cache
Header set Expires "Thu, 01 Dec 1994 16:00:00 GMT"
</IfModule>
</Files>
pngファイルのキャッシュの有効期限は
Expires: Thu, 01 Dec 1994 16:00:00 GMT
リロードしなくても反映されるようになりました。

ただし、画像をキャッシュしない訳ですから、1ページに画像が10枚あって1枚あたり100kbとして1MB…。
回線が高速化しているのでで1MBなんて大した事ないんじゃないか…という気もしますが…。

relmのディレクトリに画像のキャッシュの有効期限を過去にした.htaccessを設置するだけなら、そのほかのページへの影響はありませんが上位ディレクトリに設置してしまうと…。
.htaccessを上位ディレクトリに設置すると下位ディレクトリでも設定が有効となり、下位ディレクトリに設置すると下位ディレクトリのみ有効になるようです。
.htaccess の書き方(アクセス制御編) - Qiita

見られたくないファイルへのアクセスを拒否
キャッシュから話しがそれますが…。
もっと早く知っていれば、あちこちいじりまわさなくても良かったのかも…という設定。
<files ~ "\.(ini|log|dat)$">order allow,deny
deny from all
</files>
.htaccessで文法を間違えると下位ディレクトリを含むすべての範囲でエラーが発生し、何も表示されなくなってしまいます。

テスト用のディレクトリに.htaccessを設置して問題ない事を確認してから設置が必要なディレクトリに設置するようにしていますが…。

なぜエラーになるのかわからなくて数十分というケースも…。

お絵かき掲示板はこちら。

POTI-boardのURL欄の文字列をチェックしてフィルタリングする

POTI-boardの
//拒絶する文字列
$badstring = array("foo","bar");
は、URL欄をチェックしていません。
URL欄の文字列をチェックして拒絶する設定項目を作る事もできますが…。
config.phpの設定項目が増えて、乱雑になるのはあまり好ましい事ではないのかもしれません。
しかし、お絵かき掲示板のURL欄に
.ru
と入力しているのはコメントスパム位なので、設定で弾く事ができたほうがいいような気もします。
設定項目を増やしたくない…だったら設定したい人は本体を改造して…。
POTI-board改とテンプレートシリーズ
から、php7と、PaintBBS NEOに対応したPOTI-boardをダウンロードし、potiboard.phpの860行目付近の
//本文へのURLの書き込みを禁止
if(DENY_COMMENTS_URL && preg_match('/:\/\/|\.co|\.ly|\.gl|\.net|\.org|\.cc|\.ru|\.su|\.ua|\.gd/i', $com)) error(MSG036,$dest);
の下に
//URL欄で拒絶する文字列
if(preg_match('/\.ru$|\.su$|\.ua$/i',$url)) error(MSG037,$dest);
を追加すると…。
.ru
.su
.ua
で終わるURLを拒絶します。
cheapautoinsurancefoo.pw
autoinsurancebar.pw
autoinsurancebaz.top

コメントスパムのURLの一部を変更したサンプルです。
autoinsurance.*\.(top|pw)$
で3パターンすべて拒絶。実際に使うとしたら
//URL欄で拒絶する文字列
if(preg_match('/\.ru$|\.su$|\.ua$|autoinsurance.*\.(top|pw)$/i',$url)) error(MSG037,$dest);
でしょうか。