usar una salir rutas retroceder raiz otra moverse llamar indicar entre directorio desde como carpetas carpeta archivo php html directory

una - Archivos de directorio de visualización/descarga de PHP fuera de la raíz del servidor web



rutas include php (3)

He descargado y agregado este muy simple, un archivo, un sistema de explorador de archivos web php (llamado Indexador ) a mi servidor XAMPP.

Mi servidor XAMMP está en mi unidad C: pero quiero que Indexer muestre un directorio en mi disco G :. Pero cuando cambio (lo que creo que es) las variables de configuración correctas, no funciona correctamente.

Aquí está el código que creo que tiene que ver con el problema:

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

y luego en el código ...

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

Esto es lo que sucede: el script muestra correctamente el contenido del directorio "prueba" en la unidad G: pero cuando hago clic en el nombre del archivo, para descargar / ver el archivo, el enlace se rompe porque el php construye el enlace incorrecto ( Supongo). El enlace se ve así: http: // localhostg // [nombre del archivo].

¿Sabrías cómo resolver este problema?

Este script funciona perfectamente si cambio las variables de configuración para que muestre el contenido de un subdirectorio relativo. Y también dice que la variable $ Root puede ubicarse fuera de la raíz del servidor web.

Además, aunque hacer clic en el enlace no funciona, hacer clic derecho y seleccionar "Guardar destino como" me permite guardar / descargar el archivo.

(No dude en preguntar si necesita más información) :)


Echemos un vistazo a esa secuencia de comandos:

$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)

Tenga en cuenta que "solo tiene sentido cuando los archivos están en la raíz del servidor web" y "ruta a la que se puede acceder a los archivos indexados a través de una URL http". Lo que indica que este script no fue diseñado para poder descargar archivos que están fuera del directorio raíz del servidor web.

Sin embargo, puede modificar esta secuencia de comandos para poder hacer eso de la manera que Styu lo ha notado en su respuesta. A continuación, puede enviar sus cambios al autor del guión.

Por cierto, probé esto en mi propio servidor.


Tienes que cambiar tu configuración de Apache. El problema no es el script php, el problema es el servidor web (que no puede servir archivos fuera de la raíz web, a menos que lo configure).

Pruebe algo como esto en su configuración de apache:

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

Esto le dice a Apache que entregue archivos desde G: / test cuando acceda a http: // localhost / testalias

A continuación, cambie la configuración de su script de esa manera:

$WebServerPath = dirname("testalias");

y debería funcionar!


Su servidor web no puede ver los archivos fuera de DocRoot, por lo que no puede publicar los archivos a través del navegador con enlaces directos. readfile() imprimir sus contenidos en el navegador con readfile() con los encabezados configurados correctamente.

Para que esto funcione, debe cambiar la configuración en 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)

Y debe colocar un nuevo archivo llamado download.php en el mismo directorio que indexer.php , con este contenido:

<?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);