解決策は、リンク ターゲット自体を PHP スクリプトにすることです。
実際のファイルをブラウザからアクセスできない場所 (つまり、 経由fopen()
でファイルにアクセスできるが、ドキュメント ルート内ではない場所) に隠し、download.php ファイルを配置してファイルをダウンロードします。
ダウンロード スクリプト自体は次のようになります。
$fileid = $_REQUEST['file'];
$file = file_location($fileid); // you'd write this function somehow
if ($file === null) die("The file doesn't exist");
$allowed = check_permissions_for($file, $fileid) // again, write this
// the previous line would allow you to implement arbitrary checks on the file
if ($allowed) {
mark_downloaded($fileid, $file); // so you mark it as downloaded if it's single-use
header("Content-Type: application/octet-stream"); // downloadable file
echo file_get_contents($file);
return 0; // running a return 0; from outside any function ends the script
} else
die("You're not allowed to download this file");
あなたが指すリンクは、単純に download.php?fileid=712984 を指します (ファイル ID が実際に何であれ)。そのスクリプトはファイルを転送するため、これが実際のダウンロード リンクになります。ただし、ユーザーがそれを取得できる場合に限ります。file_location()
ただし、関数check_permissions_for()
とmark_downloaded()
関数は自分で作成する必要があります。