今日も適当ダイアリー

PHP や Javascript や Symfony、BEAR.Sunday などのWeb周りのことを中心に。それ以外のことも気まぐれに投稿します。

IEでSSL(https)だとPHP経由でのファイルのダウンロードに失敗する

ファイルのダウンロードをコントロールしたり、ダウンロード数をカウントするために、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をダウンロードできません。
このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。
」って、言われちゃう。

FireFoxOperaでは問題なくダウンロード出来るし、特別な事をやってるつもりもないんだけどなぁ。

どうしたものかと、ググる事、数分。Microsoftのサポート情報に、こんな記述が

Internet ExplorerSSL 経由によるファイルのダウンロードで "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/マイクロソフトサポート情報)