ModRewrite で画像の代わりにスクリプトを読み込む際の注意点

Apache の ModRewrite の機能を使って、PHP ファイルを画像ファイルとして読み込むといったことができるが、その際に気をつけないとハマる事がある。

ファイルの配置

例えば、.htaccessを以下のようにして、donation.png画像へのアクセスを donation.php にする。

.htaccess

donation.png は存在しない。なので、実際に読み込ませる画像を用意する。ここでは名称を dummy.png としている。

http://michaeluno.sakura.ne.jp/tests/image/donation.png
dummy.png

そして、同階層に donation.phpdummy.png ファイルを置く。
donation.pnp は以下のように記述し、dummy.png 画像をその都度読み込んでレンダリングさせるようにする。donation.pnp は以下のように記述し、dummy.png 画像をその都度読み込んでレンダリングさせるようにする。

donation.php

ディレクトリストラクチャ

これでブラウザでアクセスすると、普通の画像として表示される。このテクニック使えば、画像をランダムに表示させたり、任意のコードを実行させたりすることができる。

落とし穴

ここで、例えば、画像を差し替えようとして、仮に、donation.png.bak ファイルをバックアップとして、同階層に配置するとどうなるか。

donation.png.bak を足した

Not Found が表示される。これを知らずに、Apache に問題があるのではないか、サーバーの設定に問題があるのではないか、.htaccess の記述に誤りはないか、ファイルのパーミッションはどうなっているのか、などとトラブルシューティングしていると、大変な時間を浪費することになる。

対処方法としては、バックアップファイル名を donation.bak.png など、donation.png にマッチしないようにして回避できる。またそもそもそのようなファイルを置かないとか。

imagecreatefrompng()は全てのPNG形式に対応してない?

少しずれるが、上記のコードでは、PHP 関数の imagecreatefrompng()で png 画像を読み込むのだけど、これ、Web 上で落としてきた画像をそのまま放り込むと false を返して正常に読み込んでくれない時がある。なので、画像処理ソフトで保存し直さないといけなかったりする事がある。

軽く調べてみると、原因は bit 数がどうのこうの。ビット数変えて保存し直して読み込ませてみたけれど、特に問題なし。んー、よくわからん。

Leave a Reply

Your email address will not be published. Required fields are marked *