「pl」が2つの異なる意味を持っていたとき
2026年8月19日、.htaccessに、ブラウザに直接配信されてはならない種類のファイルをブロックするルールを追加しました。編集後にWebルートに残ったソースコードのコピー——index.php.bakや、うっかり残ったconfig.py、その他スクリプト系の拡張子を持つファイルで、訪問者がそれを実行するのではなく、ソースコードのままプレーンテキストとして取得できてしまうもの全般です。
このルールはファイルの拡張子で一致を判定するもので、.php、.py、.rb、.plなど十数種類が対象でした。.plはPerlの拡張子です。このプロジェクトにはPerlのコードは1行もありません——このルールは予防的なものであり、実在するファイルへの対処ではありませんでした。
その約1日後、あるビジターからカウンターのプレビューが壊れているという報告がありました。すべてのプレビューが、ただし1つの言語でだけ、壊れていたのです。
もう1つの「pl」
stats4u.netは、固定のデフォルト言語ではなく、Accept-Language ネゴシエーションによって訪問者ごとに言語を選んでいます——ブラウザがポーランド語に設定されていると、リダイレクトを介さず直接/pl/が配信され、何にも一致しない場合はサイトは英語にフォールバックします。ポーランド語は一致することの多い言語であり、それだけ多くの訪問者がそこに行き着くため、サムネイルが1日壊れていれば長く気づかれないままということはあり得ませんでした。
デザインのプレビューは、スタイルと言語の組み合わせごとに1つの小さなファイルになっています。例えばcache/preview/2900.pl.svgです。something.pl——つまりPerlスクリプト——を捕捉するために作られたパターンは、2900.plに続けて.svgが来るケースにも一致してしまいました。スタイル番号、たまたまスクリプトの拡張子と同じ綴りになる言語コード、そして本当のファイル種別、という並びです。「ドット、pl、ドット」というパターンでは、この2つを区別できません。
ギャラリー内のすべての.pl.svgと.pl.pngのプレビューが、403 Forbiddenを返すようになりました。ほかの言語はすべて影響を受けませんでした。このサイトが使うほかの言語コードは、どれも拡張子リストの項目と衝突しないからです。衝突したのはこの1件だけでした。
変更内容
plは拡張子リストから外しました。このプロジェクトが警戒すべき実在のスクリプト拡張子は、これまでどおりすべてブロックし続けますが、言語をブロックすることはもうありません。
そもそもなぜこれが起きたのかを書き残しておく価値があります。ファイル拡張子の一覧と言語コードの一覧は、まったく別の語彙体系から来ており、2文字のエントリが両方の意味を同時に持つことを妨げるものは何もありません。パスに言語プレフィックスを持つサイトでは、どちらかのリストに追加する前に、もう一方のリストと照らし合わせて確認すべきです。私たちはそれをしておらず、気づいたのは自分たちの監視ではなく、壊れたサムネイルに気づいた読者からの報告でした。