2013-02-05 49 views
1

你知道是否可以通過單擊代碼中的鏈接來創建文件,並通過在地址欄中複製/粘貼URL訪問文件來限制訪問?PHP make file只能在代碼

例子:

我生成發票爲PDF格式,我想讓他們只爲記錄在客戶和僅針對此特定客戶產生的發票提供。客戶A不能看到客戶B的發票,反之亦然。

現在我保存這些發票在這裏: www.mydomain.com/invoices/

和客戶A的發票是一樣的東西: www.mydomain.com/invoice/20130202_120045.pdf

現在我想有可能是一個客戶只能看到這個PDF時,我在HTML中增加這樣一個環節:

<a href="http://www.mydomain.com/invoice/20130202_120045.pdf">See invoice</a> 

但PDF不應該通過直接www.mydomain.com/invoice鍵入訪問/ 20130202_1200 45.pdf在地址欄中。

這是以某種方式可能嗎?

+0

另請參閱:http://stackoverflow.com/questions/10596116/caching-http-responses-when-they-are-dynamically-created-by-php/10596231#10596231 - 它解釋了這可以很容易地通過對[readfile()](http://php.net/manual/en/function.readfile.php)使用'X-SendFile'(系列) –

回答

4

有多種方法,但我會說這是最簡單的一個:

  • 商店中只有PHP訪問的目錄實際PDF(你的網站根目錄外或阻止.htaccess爲例)。
  • 驗證PHP腳本中的訪問權限。
  • 讓下載通過使用標頭Content-disposition的PHP腳本來設置文件名並使用readfile()來輸出文件內容。
+0

+1而沒有招致PHP開銷,從未使用它,didn'噸甚至知道它存在:) –

+0

謝謝,這是訣竅! –

2

當然 - 最簡單的方法是使用.htaccess。您可以將不應通過URL下載的所有文件存儲在一個文件夾中,然後將其全部重定向到PHP腳本。

這樣,當一個人試圖下載http://www.mydomain.com/invoice/20130202_120045.pdf時,他們將(在後臺通過.htaccess)重定向到某個PHP腳本。

這PHP腳本就可以驗證,如果該人被授權(通過會議,餅乾......),只有輸出的原始文件,如果他們(或錯誤消息,如果他們不是)。

您可以使用fgets()函數來輸出部分文件,以確保您的服務器上的內存不會超載。

此方法的缺點可能是可擴展性,因爲用戶下載的文件越多,需要運行的PHP腳本越多,並且可能會在某些時候超載Apache。但是,如果代碼寫得好(即使用與fgets()等)

0

使用mod_xsendfile這是很容易的,這將是不可能的。你堅持的文件的文檔根目錄之外,併發出特殊的頭,告訴阿帕奇發送的文件在你的代表:

設置它後,代碼是如此簡單:

<?php 
... 
if ($user->isLoggedIn()) 
{ 
    header("X-Sendfile: $path_to_somefile"); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=\"$somefile\""); 
    exit; 
} 
?> 
<h1>Permission denied</h1> 
<p>Login first!</p> 

源代碼取自模塊頁面本身。