2013-10-28 39 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