2010-12-07 4 views
1

J'ai téléchargé et ajouté ce très simple, un fichier, système d'explorateur de fichiers web PHP (appelé Indexer) à mon serveur XAMPP.PHP afficher/télécharger les fichiers du répertoire en dehors de la racine du serveur web

Mon serveur XAMMP se trouve sur mon lecteur C: mais je souhaite que l'indexeur affiche un répertoire sur mon lecteur G :. Mais quand je change (ce que je pense être) les bonnes variables de configuration, cela ne fonctionne pas correctement.

Voici le code que je pense est à voir avec le problème:

// configuration 
$Root = realpath("G:/test"); 
$AllowDownload = TRUE; 
$WebServerPath = dirname("G:/test"); 

et plus tard dans le code ...

elseif ($AllowDownload) { 

     echo "<a href=\"http://".getenv("SERVER_NAME").$WebServerPath."/$rel_path".$item["filename"]."\">".$item["name"]."</a>"; 
    } 

C'est ce qui se passe: Le script -t afficher correctement le contenu du répertoire "test" sur le lecteur G:, mais lorsque je clique sur le nom du fichier, pour télécharger/afficher le fichier, le lien est rompu parce que le php construit le lien faux (je suppose). Le lien ressemble à ceci: http: // localhostg // [nom du fichier].

Savez-vous comment résoudre ce problème?

Ce script fonctionne parfaitement si je modifie les variables de configuration afin qu'il affiche le contenu d'un sous-répertoire relatif. Et il dit aussi que $ Root variable peut être situé en dehors de la racine du serveur web.

Même si cliquer sur le lien ne fonctionne pas, cliquer avec le bouton droit de la souris et sélectionner "Enregistrer la cible sous" permet de sauvegarder/télécharger le fichier.

(Ne hésitez pas à demander si vous avez besoin de plus d'informations) :)

Répondre

4

Votre serveur web ne peut pas voir les fichiers en dehors du DocRoot, donc il ne peut pas servir les fichiers via le navigateur avec des liens directs. Vous devez imprimer leur contenu dans le navigateur avec readfile() avec les en-têtes correctement définis.

Pour faire ce travail, vous devez changer la configuration indexer.php:

// this way it works with accentuated letters in Windows 
$Root = utf8_decode("G:\test"); // define the directory the index should be created for (can also be located outside the webserver root) 

$AllowDownload = TRUE; // enclose file items with the anchor-tag (only makes sense when the files are in the webserver root) 
// you need to place download.php in the same directory as indexer.php 
$WebServerPath = dirname($_SERVER['SCRIPT_NAME']) . "/download.php?path="; // path where the indexed files can be accessed via a http URL (only required when $AllowDownload is TRUE) 

Et vous devez placer un nouveau fichier appelé download.php dans le même répertoire que indexer.php, avec ce contenu:

<?php 

// it must be the same as in indexer.php 
$Root = utf8_decode("G:\test"); 

function checkFileIsInsideRootDirectory($path, $root_directory) { 
    $realpath = realpath($path); 

    if (!file_exists($realpath)) 
     die("File is not readable: " . $path); 

    // detects insecure path with for example /../ in it 
    if (strpos($realpath, $root_directory) === false || strpos($realpath, $root_directory) > 0) 
     die("Download from outside of the specified root directory is not allowed!"); 
} 

function forceDownload($path) { 
    $realpath = realpath($path); 

    if (!is_readable($realpath)) 
     die("File is not readable: " . $path); 

    $savename = (basename($path)); 

    header("Pragmaes: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private", false); 
    header("Content-type: application/force-download"); 
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-length: " . filesize($path)); 
    header("Content-disposition: attachment; filename=\"$savename\""); 

    readfile("$path"); 
    exit; 
} 

if (!isset($_GET['path'])) 
    die("Path not specified!"); 

$fullPath = $Root . $_GET['path']; 

checkFileIsInsideRootDirectory($fullPath, $Root); 

forceDownload($fullPath); 
+0

Merci d'avoir répondu! Cela semble prometteur. où aurais-je besoin de mettre ce code (et aurais-je besoin de changer les noms de variables)? – Jopper

+0

Édité ma réponse, maintenant cela fonctionne bien avec ['indexer'] (http://tbmnet.de/tbmnet.php?content=php_indexer). –

+0

Merci pour votre soutien continu :) Où devrais-je mettre le code et que faut-il remplacer? – Jopper

1

Jetons un coup d'oeil à ce script:

$Root = realpath("."); // define the directory the index should be created for (can also be located outside the webserver root) 
$AllowDownload = TRUE; // enclose file items with the anchor-tag (only makes sense when the files are in the webserver root) 
$WebServerPath = dirname(getenv("SCRIPT_NAME")); // path where the indexed files can be accessed via a http URL (only required when $AllowDownload is TRUE) 

Remarque "n'a de sens que lorsque les fichiers sont dans la racine du serveur Web" et "chemin où les fichiers indexés peuvent être accessibles via une URL http". Ce qui indique que ce script n'a pas été conçu pour pouvoir télécharger des fichiers situés en dehors du répertoire racine du serveur Web.

Cependant, vous pouvez modifier ce script pour pouvoir le faire de la manière que styu a noté dans sa réponse. Vous pouvez ensuite envoyer vos modifications à l'auteur du script.

BTW, j'ai testé cela sur mon propre serveur.

2

Vous devez changer la configuration de votre apache. Le problème n'est pas le script php, le problème est le serveur web (qui n'est pas capable de servir les fichiers en dehors de la racine web, sauf si vous le configurez).

Essayez quelque chose comme ceci dans votre configuration apache:

Alias /testalias "G:/test" 
<Directory "G:/test"> 
    Options Indexes FollowSymLinks MultiViews ExecCGI 
    AllowOverride All 
    Order allow,deny 
    Allow from all 
</Directory> 

Cela dit Apache pour servir des fichiers de G:/test lorsque vous accédez http://localhost/testalias

Ensuite, changez votre configuration de script comme ça:

$WebServerPath = dirname("testalias"); 

et cela devrait fonctionner!

+0

L'avez-vous essayé? – travelboy

+0

J'ai trouvé un fichier dans le dossier XAMPP Apache config (conf) appelé "httpd.conf". Je suppose que c'est le bon fichier, mais est-ce que je colle simplement le code (de votre première boîte de code) dans ce fichier, ou est-ce que j'écris quelque chose? Aussi, ai-je besoin de changer le nom de "testalias" au nom du dossier dans lequel se trouve le fichier Indexer.php? – Jopper

Questions connexes