IISSBB
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору У меня есть Win2003Server, там крутится Web-сервер на IIS, есть PHP+MySQL, плюс ещё ISAPI Rewrite (аналог mod_rewrite) Необходимо реализовать выдачу ссылок на большие файлы (700-900 МБ), которые бы были рабочими только для того, кому они были выданы. В противном случае - если человек передал свою ссылку кому-то ещё - выдавалось бы сообщение - "Неверная ссылка" или что-то в это духе, но это не важно. В общем, как это реализовано на ifolder.ru или любых других файлообменных серверах. Просто интересно, как это реализовать. Подайте саму идею, что да как. Мне пока пришёл в голову только такой механизм: 1) Генерирую ссылки в зависимости от IP пользователя и времени получения ссылки вида: http://site.ru/строка_идентифицирующая_пользователя/название_файла.ext 2) ISAPI Rewrite по такому правилу: Код: RewriteEngine on RewriteCond %{HTTP_REFERER} !^http://(www\.)?site.ru RewriteRule .*\.(?:avi|rar|zip|3gp|msi|iso|mpg) /hidden.php [NC] | подхватывает эту ссылку и переводит её на скрипт /hidden.php 3) В скрипте из $_SERVER[HTTP_X_REWRITE_URL] выдирается "строка_идентифицирующая_пользователя" и из неё выбираются (расшифровываются) параметры пользователя, а после сравниваются с теми параметрами, которые посчитает сам скрипт и если все true - то выдаётся файл вот таким вот образом: Код: if (!file_exists($path)){ header ("HTTP/1.0 404 Not Found"); exit; } $fd = @fopen($path, "rb"); if (!$fd){ header ("HTTP/1.0 403 Forbidden"); exit; } $ftime = date("D, d M Y H:i:s T", filemtime($path2)); if (@$_SERVER["HTTP_RANGE"]){ @$range = $_SERVER["HTTP_RANGE"]; @$range = str_replace("bytes=", "", $range); @$range = str_replace("-", "", $range); if (@$range){ fseek($fd, @$range); } header("Content-Type: application/x-download"); header("Content-Transfer-Encoding: binary\r\n"); header("Accept-Ranges: bytes"); header("Content-Disposition: attachment; filename=$filename"); header("Last-Modified: $ftime"); header("Content-Length: ".($size-$range)); header("Content-Range: bytes $range-".($size -1)."/".$size); header("Content-type: application/octet-stream"); if (@$range){ header("HTTP/1.1 206 Partial Content"); }else{ header("HTTP/1.1 200 OK"); } set_time_limit(0); $fd = @readfile($path2, "rb"); $content = fread($fd, $size) fclose($fd); | Но такой вариант не подходит, потому как файл начинает передаваться через скрипт. А нужно чтобы передача производилась так же, если бы выдавалась прямая ссылка на файл. |