やっていることはトンネル。
function forwardBin($url) {
// ウェブブラウザが独自にMIMEタイプを判断する処理を抑止する
header('X-Content-Type-Options: nosniff');
// ダウンロードするべきファイル情報を先に取得して、その内容をそのまま設定
$filename = basename($url);
$headers = get_headers($url, 1);
header('Content-Type: ').$headers['Content-Type'];
header('Content-Length: '.$headers['Content-Length']);
header("Content-Disposition: attachment; filename=${filename}");
// readfile()の前に出力バッファリングを無効化する
while (ob_get_level()) {
ob_end_clean();
}
// ダウンロード
readfile($url);
exit;
}
【PHP】正しいダウンロード処理の書き方 を参考にしました。