Загрузите PHP-скрипт вместо его выполнения

У меня есть каталог downloads на веб-сайте, где я храню кучу разных файлов для скачивания (zip, exe, java, php и т. д.). Проблема в том, что мой веб-сайт написан на PHP, поэтому веб-сервер Apache пытается выполнять сценарии вместо того, чтобы позволить людям их загружать. Не имея доступа к конфигурации Apache (я на виртуальном хостинге), какой самый простой способ запретить Apache выполнять сценарии в одном каталоге?

Я безуспешно пытался использовать mod_mime. AddType не работает, потому что (я предполагаю) тип MIME уже связан с PHP-скриптами. ForceType не работает, потому что я храню в каталоге файлы разных типов. Есть ли другие варианты?


person MiseryIndex    schedule 25.12.2009    source источник


Ответы (5)


Если у вас есть для этого достаточные права, поместите следующую строку в файл .htaccess в каталоге, в котором вы не хотите, чтобы скрипт PHP выполнялся, может помочь:

php_flag engine off

(Только что проверил на моем веб-сервере, и я получил исходный код PHP-скрипта, который не был выполнен)

person Pascal MARTIN    schedule 25.12.2009
comment
+1 за это - если у вас есть на это разрешения (что у вас, вероятно, есть), это, вероятно, будет идеальным решением. - person Amber; 25.12.2009
comment
Безусловно, самый простой способ сделать то, что мне нужно, но я могу не использовать этот метод. Поскольку в моем скрипте есть немного HTML, браузеры пытаются отобразить все, что могут, и результат выглядит плохо. Есть ли какие-то волшебные средства заставить сервер также отображать мои сценарии в виде обычного текста? - person MiseryIndex; 25.12.2009
comment
Ознакомьтесь с serverfault.com/questions/82505/ - person Ciarán Walsh; 25.12.2009
comment
@Ciarán: ForceType не принесет никакой пользы, потому что у меня есть файлы разных типов в каталоге. - person MiseryIndex; 26.12.2009
comment
@self: На самом деле, вы можете использовать директиву AddType после включения движка PHP. Добавьте AddType text/plain .php к следующей строке, и все заработает как по маслу! - person MiseryIndex; 26.12.2009

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

person Amber    schedule 25.12.2009

Я думаю, что обычное решение этой проблемы — дать файлам расширение phps.

person Pekka    schedule 25.12.2009
comment
Креативно, но нет, хочу php ;-) - person MiseryIndex; 26.12.2009

Думаю, у меня есть решение для вас. Проверь это:

http://www.boutell.com/newfaq/creating/forcedownload.html

По сути, в нем говорится, что на вашей php-странице должен быть следующий код:

<?php
header('Content-disposition: attachment; filename=whatever.php');
header('Content-type: text/html');
readfile('whatever.php');
?>

Я сделал образец здесь:

http://sotkra.com/test.php

Это вызывает приглашение «загрузить» файл, где загрузка файла — это what.php

Ваше здоровье

person Capagris    schedule 25.12.2009

У вас должен быть скрипт шлюза загрузки, такой как download.php. Он должен принимать аргумент строки запроса, в котором перечислены файлы, которые необходимо загрузить.

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

Затем используйте:

<?php
$file = trim(isset($_GET['file']) ? $_GET['file'] : '');

$allow = array(
    'foo.php' => 'text/plain',
    'foo.jpg' => 'image/jpeg',
);    

if(! isset($allow[$file]))
   die('File not found.');

header('Content-Type: ' . $allow[$file]);
readfile($file);
person gahooa    schedule 25.12.2009