下载PHP脚本而不是执行它

时间:2009-12-25 20:17:51

标签: php apache mime-types

我在网站上有一个downloads目录,我存储了一堆不同的文件供人们下载(zip,exe,java,php等)。问题是我的网站是用PHP编写的,所以Web服务器Apache试图执行脚本而不是让人们下载它们。无法访问Apache配置(我在共享主机上),阻止Apache在单个目录中执行脚本的最简单方法是什么?

我尝试使用mod_mime失败了。 AddType不起作用,因为(我猜)一个MIME类型已经与PHP脚本相关联。 ForceType不起作用,因为我在目录中存储了不同类型的文件。还有其他选择吗?

5 个答案:

答案 0 :(得分:13)

如果您有足够的权限,将以下行放在您不希望执行PHP脚本的目录中的.htaccess文件中可能会起到作用:

php_flag engine off

(刚刚在我的网络服务器上测试过,我得到了一个PHP脚本的来源 - 尚未执行)

答案 1 :(得分:5)

您可以编写一个单独的PHP脚本,该脚本发送正确的Content-type标头,然后使用readfile()来传递PHP文件的内容而不用PHP实际执行它们(并且因为Apache已经将请求传递给PHP,它不再关心)。只需确保将其限制为只提供该目录之外的内容。

答案 2 :(得分:3)

我认为通常的解决方案是为文件提供扩展名phps

答案 3 :(得分:2)

我想我有适合你的解决方案。看看这个:

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

这会强制“下载”文件提示,其中文件下载是whatever.php

干杯

答案 4 :(得分:2)

您应该有一个下载网关脚本,例如download.php。它应该采用一个查询字符串参数,列出需要下载的文件。

该参数应该与预先存在的可访问文件的ARRAY(那里的大安全点)相匹配。

然后使用:

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