PHP glob/scandir和Linux软链接/权限

Cas*_*sen 2 php apache permissions symlink

我正在尝试编写一个简单的在线音乐播放器来改进我的编程.

我有一台运行CentOS 6.5的服务器,外部硬盘包含我的所有文件.我安装了我的存储分区/mnt/storage,我的音乐在/mnt/storage/cascornelissen/Muziek,它具有以下权限:

drwxrwxr-x 19 cascornelissen ftpusers       4096 Nov  4 14:43 Muziek
Run Code Online (Sandbox Code Playgroud)

然后我有一个简单的httpd网络服务器,托管项目/var/www/html/melodi,它保存了前面提到的Muziek目录的软链接:

lrwxrwxrwx 1 root           ftpusers   34 Jan 26 22:31 music -> /mnt/storage/cascornelissen/Muziek
Run Code Online (Sandbox Code Playgroud)

我想使用PHP glob列出所有文件,但返回一个空数组.所以我试过,scandir("music")但它返回以下错误:

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

有关如何解决此权限问题的任何想法?

gre*_*eke 5

试试这个:

chmod ugo+x /mnt /mnt/storage /mnt/storage/cascornelissen
Run Code Online (Sandbox Code Playgroud)

您的路径的某些部分可能不允许您的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
Run Code Online (Sandbox Code Playgroud)

所以,execute permission或者x对于目录意味着我们可以访问它下面的路径,即使我们无法读取目录本身的内容.在您的情况下,Apache需要"遍历" 权限,/mnt/storage/cascornelissen即使它到达之前不会读取任何文件Muziek.

  • 将在答案中添加解释 (2认同)