2014-01-26 55 views
2

我正在嘗試編寫一個簡單的在線音樂播放器來改進我的編程。PHP glob/scandir和Linux軟鏈接/權限

我有一臺運行CentOS 6.5的服務器,其中包含所有文件的外部硬盤。我安裝我的存儲分區/mnt/storage和我的音樂是/mnt/storage/cascornelissen/Muziek,它具有以下權限:

drwxrwxr-x 19 cascornelissen ftpusers  4096 Nov 4 14:43 Muziek 

然後,我有一個簡單的httpd web服務器,託管在/var/www/html/melodi的項目,該項目constains的軟鏈接所提到的Muziek目錄早期:

lrwxrwxrwx 1 root   ftpusers 34 Jan 26 22:31 music -> /mnt/storage/cascornelissen/Muziek 

我想用PHP的glob列出所有的文件,但返回一個空數組。所以,我想scandir("music")但它返回以下錯誤:

Warning: scandir(music): failed to open dir: Permission denied in /var/www/html/melodi/index.php on line 42 

關於如何解決此權限問題的任何想法?

+1

你使用的是符號鏈接嗎? – maverabil

+0

對不起,你到底是什麼意思? –

回答

5

試試這個:

chmod ugo+x /mnt /mnt/storage /mnt/storage/cascornelissen 

可能是你的路徑的某些部分將不會允許Apache的用戶輸入。允許進入目錄意味着將xexecute permissions添加到目錄。

說明

# create path a/b 
mkdir -p a/b 
ls a/b   # this works 

# now remove all permissions for a 
chmod 000 a 
ls a/b   # ls: cannot access a/b: Permission denied 
       # but why, we should still have permission for b?? 
       # Now, lets add x permission for a: 
chmod ugo+x a 
ls a/b   # works again 
ls a   # ls: cannot open directory a: Permission denied 
       # So, we cannot list contents of a, but we can 
       # access a/b *through* a 

所以,execute permissionx目錄意味着我們可以訪問它下面的路徑,即使我們無法讀取目錄本身的內容。在你的情況下,Apache需要允許「遍歷」/mnt/storage/cascornelissen,即使它不會讀取任何文件,直到它達到Muziek

+0

太棒了,工作!你介意更深入地解釋一下嗎? apache是​​否需要'/ Muziek'的每個父母的執行權限? –

+2

將在答案中加上解釋 – grebneke