PHP отображает / загружает файлы каталога за пределами корня веб-сервера

Я загрузил и добавил этот очень простой, один файл, php web file explorer system (называемый Indexer ) на мой сервер XAMPP.

Мой сервер XAMMP находится на моем диске C :, но я хочу, чтобы Indexer отображал каталог на моем диске G :. Но когда я изменяю (то, что я думаю) правильные переменные конфигурации, он работает неправильно.

Вот код, который, я думаю, касается проблемы:

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

а затем в коде …

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

Вот что происходит: скрипт корректно отображает содержимое «тестового» каталога на диске G :, но когда я нажимаю имя файла, чтобы загрузить / просмотреть файл, ссылка не работает, потому что php неправильно создает ссылку ( Я полагаю). Ссылка выглядит так: http: // localhostg // [имя файла].

Знаете ли вы, как решить эту проблему?

Этот скрипт отлично работает, если я изменяю переменные конфигурации, чтобы отображать содержимое относительного подкаталога. И он также говорит, что переменная $ Root может находиться за пределами корня веб-сервера.

Кроме того, хотя щелчок по ссылке не работает, щелчок правой кнопкой мыши и выбор «Сохранить объект как» позволяет мне сохранить / загрузить файл.

(Не стесняйтесь спрашивать, нужна ли вам дополнительная информация) 🙂

Ваш веб-сервер не может видеть файлы вне DocRoot, поэтому он не может обслуживать файлы через браузер с прямыми ссылками. Вам нужно распечатать их содержимое в браузере с помощью readfile() с правильно настроенными заголовками.

Чтобы выполнить эту работу, вам нужно изменить конфигурацию в 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) 

И вы должны поместить новый файл с именем download.php в тот же каталог, что и indexer.php , с этим контентом:

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

Вы должны изменить свою конфигурацию apache. Проблема не в скрипте php, проблема в том, что веб-сервер (который не может обслуживать файлы за пределами веб-корня, если вы не настроили его).

Попробуйте что-то подобное в настройке apache:

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

Это сообщает Apache, чтобы он обслуживал файлы из G: / test при доступе к http: // localhost / testalias

Затем измените конфигурацию своего скрипта следующим образом:

 $WebServerPath = dirname("testalias"); 

и он должен работать!

Давайте посмотрим на этот скрипт:

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

Уведомление «имеет смысл только в том случае, если файлы находятся в корневом каталоге веб-сервера» и «путь, к которому можно получить доступ к индексированным файлам через URL-адрес http». Это означает, что этот сценарий не был предназначен для загрузки файлов, находящихся за пределами корневого каталога веб-сервера.

Тем не менее, вы можете изменить этот скрипт, чтобы иметь возможность сделать это так, как стилю отметил в своем ответе. Затем вы можете отправить свои изменения автору сценария.

Кстати, я тестировал это на своем собственном сервере.