to pozostaje tylko zmiana serwera
a podstawowe pytanie - czy w ogóle ten serwer pozwala na ściągnięcie z siebie pliku zip czy dodaje też do plików reklamy
z header nawet nie próbuj bo to wysyła zmianę strony do przeglądarki która znowu spróbuje otworzyć ten sam plik, znowu przekieruje na ten sam i utworzy się nieskończona pętla
ew. spróbuj jeszcze zmienić:
readfile($root.'download/'.$file);
na:
$p = fopen($root.'download/'.$file,'rb');
while (!feof($p)) echo fgets($p, 10240);
fclose($p);
albo może się uda jakoś oszukać serwer, np na końcu zamiast exit daj ob_start();
łącząc wszystko, spróbuj:
<?php
error_reporting(0);
$root = './';
if (!isset($_GET['name'])){
header('HTTP/1.1 400 Bad Request');
Die();
}
$file = $_GET['name'];
if (!file_exists($root.'download/'.$file.'.download')){
header('HTTP/1.1 403 Forbidden');
Die();
}
if (!file_exists($root.'download/'.$file)){
header('HTTP/1.1 404 Not Found');
Die();
}
ob_clean();
$path = pathinfo($file);
$plik_log = $root.'logs/'. str_replace(Array('/','.'),Array('-','_'),
$path['dirname']).'-'.$path['basename'].'.txt';
$pl = fopen($plik_log, 'a+');
flock($pl, LOCK_EX);
fseek($pl, 0);
$cnt = (int) fgets($pl);
ftruncate($pl, 0);
$cnt++;
if ($cnt<1) $cnt = 1;
fwrite($pl, $cnt);
flock($pl, LOCK_UN);
fclose($pl);
header('Content-Type: application/x-unknown');
header('Content-Disposition: attachment; filename='.$path['basename']);
header('Content-Length: '.filesize($root.'download/'.$file));
$p = fopen($root.'download/'.$file,'rb');
while (!feof($p)) echo fgets($p, 10240);
fclose($p);
ob_start();
?>
to przy okazji trochę zabezpieczone, licznik nie nadpisuje pliku do pobrania w przypadku wykorzystania "kropek" tylko zapisuje zawsze w pliku z dodatkowym rozszerzeniem ".txt" i pliku nie będzie można pobrać jeśli nie znajduje się plik o takiej samej nazwie i rozszerzeniu ".download" czyli jak chcesz żeby można było ściągnąć plik "1.zip" to koło niego tworzysz pusty plik o nazwie "1.zip.download" - można też zrobić to na jakiejś liście albo na miliard innych sposobów