2013-10-28 96 views
3

我试图限制直接访问目录中的文件。所以例如我有 website.com/files/example.flv。php限制访问目录中的文件

因此,如果用户直接访问URL中的文件,我希望他们被重定向到主页。

我曾尝试使用htaccess的以下

deny from all 

,但它不是伟大的工作。有没有办法,我可以做到这一点使用PHP,然后在用户直接到URL中的文件,他们将被重定向。

因此,如果用户转到url中的文件链接,它们将被发送到主页。因此,这只能使用htaccess

+0

在您的文件夹中创建一个index.php文件。 Apache在你的文件夹中执行index.php。 在你的index.php中,你可以用header()函数重定向到另一个页面 – demonking

+0

这是非常不安全的,因为文件本身仍然可以访问。 –

回答

4

如果你想限制对文件的访问,你应该考虑将它们存储在public DocumentRoot之外并使用PHP来传递文件,应用你自己的访问逻辑。这意味着在www或public_html文件夹之外,这取决于您正在使用的托管环境。

<?php 

// Suppose your "public_html" folder is . 
$file = './../data/test.gif'; 
$userCanDownloadThisFile = false; // apply your logic here 

if (file_exists($file) && $userCanDownloadThisFile) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename=filename.gif'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
} 
+0

感谢这有助于加载。我不知道你可以将文件保存在public_html –

5

是的。您必须将文件放置在无法通过网络访问的目录中。然后,你必须在public_html/files /文件夹中创建一个指向你的PHP脚本的.htaccess文件。

像这样的东西(注:未测试的代码):

结构:

  • 根/
    • realfiles/
    • 的public_html/
      • 文件/
        • htaccess的
      • filehandler.php

的.htaccess:

RewriteEngine on 
RewriteRule ^/files/(.+)$ filehandler.php?stuff=$1 [QSA] 

filehandler.php:

header('Location: /'); 

当然,您希望文件在您希望访问它们时可以访问。这可以通过filehandler.php来完成,通过检查用户是否被允许查看文件,然后返回如下内容:

header('Content-type: application/octet-stream'); 
header('Content-Disposition: inline; filename="'.basename(urlencode($file['name'])).'"'); 
readfile($dir.basename($file['filename'])); 
exit; 
+0

之外如果文件非常大,你可能会用尽内存,所以你要小心。 – ahwm

+0

谢谢,但如果它在目录之外,你将如何获得文件名? –

+0

@DanielLematy我已经更新了答案(请参阅.htaccess,?stuff = $ 1)。 $ _GET ['stuff']现在包含文件名/请求。 – sgtdck