我在网站上有一个downloads
目录,我存储了一堆不同的文件供人们下载(zip,exe,java,php等)。问题是我的网站是用PHP编写的,所以Web服务器Apache试图执行脚本而不是让人们下载它们。无法访问Apache配置(我在共享主机上),阻止Apache在单个目录中执行脚本的最简单方法是什么?
我尝试使用mod_mime失败了。 AddType不起作用,因为(我猜)一个MIME类型已经与PHP脚本相关联。 ForceType不起作用,因为我在目录中存储了不同类型的文件。还有其他选择吗?
答案 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');
?>
我在这里做了一个样本:
这会强制“下载”文件提示,其中文件下载是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);