Скрытие адреса при защищенном скачивании файла по URL

создаем файл getfile.php:

<?php

session_start();
if($_SESSION['authorization']!="authorization_executed") { @header('Location: http://сайт.ру'); exit; }

switch($_GET['file']){
      case 1:  $filename="http://сайт.ру/file1.zip";break;
      case 2:  $filename="http://сайт.ру/file2.zip";break;
      case 3:  $filename="http://сайт.ру/file3.zip";break;
    default :  $filename="File not found";
      }

function file_force_download($file) {
$head_size = @get_headers($file);

if(strpos($head_size[0], '200')) {
    if (ob_get_level()) {
      ob_end_clean();
    }
	$size = str_replace("Content-Length: ", "", $head_size[6]);
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . $size);
    ob_clean();
    flush();
    readfile($file);
	exit;
} else {
	@header('Location: http://сайт.ру'); exit;
}
}

file_force_download($filename);

в файле index.php (например) стартуем сессию, которую в дальнейшем будем проверять в начале getfile.php:

session_start();
$_SESSION['authorization']="authorization_executed";

и ссылки на скачивание делаем такого вида: /getfile.php?file=2 + так же модно переделать под свои нужды и вместо списка файлов указывать только их имена, а сами файлы положить где-то на сервере (предварительно в скрипте добавив информацию о пути от корня)