ファイルのダウンロードをコントロールしたり、ダウンロード数をカウントするために、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/(マイクロソフトサポート情報)