ファイルのダウンロードをコントロールしたり、ダウンロード数をカウントするために、PHP経由でファイルを転送したい場合ってのがあるのですが、キャッシュに残るのも気持ち悪い、とかで、たいてい、下記のようなスクリプトで対応してきました。
<?php $filepath = '../datas/hoge.dat'; $filename = 'hoge.dat'; // ファイルが存在すれば if (is_file($filepath)) { // ヘッダーを出力(キャッシュ制御とファイル名の指定など) header('Pragma: no-cache'); header('Cache-control: no-cache'); header('Content-type: application/octet-stream'); header('Content-Length: ' . filesize($filepath)); header("Content-Disposition: attachment; filename=\"{$filename}\""); header('Expires: Mon, 3 Jun 2005 10:00:00 GMT'); header('Content-Transfer-Encoding: binary'); @readfile($filepath); } ?>
で、普通ならこれで問題ないんだけど、今日、このスクリプトをssl経由で実行したら、IEでエラーが。。。
「Internet Explorerでは、hoge.datをダウンロードできません。
このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。」って、言われちゃう。
FireFoxやOperaでは問題なくダウンロード出来るし、特別な事をやってるつもりもないんだけどなぁ。
どうしたものかと、ググる事、数分。Microsoftのサポート情報に、こんな記述が
「Internet Explorer が SSL 経由によるファイルのダウンロードで "No-Cache" ヘッダーを処理できない」って、え!?
IEでは、ファイルのダウンロードの際に、一回キャッシュディレクトリに保存されるから、キャッシュしないようにヘッダーで指示すると、ダウンロードできなくなってしまうのでしょうか……
ま、no-cacheだと処理出来ないってことは、no-cacheを送信しなければ問題ないだろうと思い、下記2行を変更。
<?php header('Pragma: private'); header('Cache-control: private, must-revalidate'); ?>
これで、無事ダウンロード出来るようになりました。
参考:http://support.microsoft.com/kb/323308/ja/(マイクロソフトサポート情報)