いつもブログを読んでくれてありがとうございます。
「コメント欄の画像認証(キャプチャ)が表示されないことがある」という不具合に気づきました。
最近設置した拍手ボタンは押してもらえていたのに、コメントは無かったので、
いま思うと「読んでくれてるのに書き込めなかった」方もいたのかもと反省しています。
目次
何が起きていたのか
原因を調べてみたら、仕組みのすれ違いのようでした。
このブログでは、コメント欄のスパム対策として「SiteGuard WP Plugin」という画像認証機能を使っていました。
ログインした状態だと普通に表示されていたので、この不具合に気づけませんでした。
流れを整理すると、こんな感じだと思われます。
- SiteGuardは、誰かがページを開くたびに `/wp-content/siteguard/ランダムな数字.png` というその場限りの認証画像を新しく作るようです
- その画像のURLは、表示されたページのHTMLの中に埋め込まれます
- ところが、このブログはキャッシュ用プラグイン(WP-Optimize)も使っていました
- そのため、次に別の人が同じページを開いたときも、さっき作られたHTMLがそのまま表示されてしまうようです
- そのHTMLの中には古い画像のURLが書かれたままですが、肝心の画像ファイル自体はもう存在しません(SiteGuardが一定時間で消したり、別の人がアクセスした時に上書き・削除されたりするためと思われます)
- 結果として認証画像の404エラーが起きていたようです
つまり、表示されているHTMLと、実際に存在する画像ファイルがズレてしまっていた、というのが正体でした。
なぜこれが起きやすいのか
「アクセスのたびに動的に作り直される画像」って、ページキャッシュとの相性が悪いようです。
キャッシュは「一度作ったページをそのまま使い回して表示を速くする」ための仕組みですが、画像認証は逆に「毎回新しく作り直す」ことが前提の仕組みです。この二つが同時に動くと、今回みたいに「もう存在しない画像を見てと言い続けるページ」ができあがってしまいます。
どう対応したか
このブログはAkismetというスパム対策プラグインも併用していたので、思い切って画像認証機能自体をオフにしました。
もし今後スパムコメントが増えてきたら、reCAPTCHAなど別の仕組みを検討しようと思っています。
最後に
これまでコメントを送ろうとして送れなかった方がいたら、ごめんなさい。
今は直っているはずなので、もしよかったらまた気軽にコメントしてもらえたら嬉しいです。