Skip to content

apache 没有显示文件

使用 apache 的时候,有时会发现明明在目录里的文件却没有显示,这多半是权限问题。

问题发生缘由

首先提一下我遇到这个问题的开始。ArchLinux 的 apache 存放目录在 /srv/http,因为在这下面编辑文件要 root 权限,很麻烦。所以我就使用软链接的方式来解决这个问题,比如下面这个例子,这样我编辑 test.html 就不需要转到 root 了。

touch /home/allen/test.html
sudo ln -s /home/allen/test.html /srv/http/test.html

但是问题就发生了,我发现输入 localhost 并没有显示这个文件,然后强行输入 localhost/test.html 返回了 403 Forbidden,是权限问题。
这个也很好理解,apache 使用的是 http 用户,如果它没有 /home/allen/test.html 这个文件访问权限的话,肯定就不能在网页上显示了。

第一种做法

这个是前几天同学也遇到这个问题我帮他解决的方式,很直观暴力,就是改文件权限的 other 部分。这里要注意:一定要确保所有上游目录的访问权限。比如例子中的 /home/allen/test.html,它的解决要求如下。

# 目录需要 x 权限才能进去
chown u+rx /home
chown u+rx /home/allen
# 文件就没必要 x 权限了
chown u+r  /home/allen/test.html

那天也是因为 /home/allen 这个目录权限一直没有注意,导致搞了一会,希望大家汲取经验。

第二种做法

结果过几天后我自己也遇到了这个问题。我本来也想直接用第一种做法解决,但我在查看 /home/allen 目录权限时,发现一个盲点。

drwxr-x---+ 57 allen allen  4096 Jun 11 23:40 allen

哎,他目录后面有个 +,这表示什么? 查阅资料后,发现这表示这个目录有 ACL 设置!
突然想起来,本科期间无聊看过的《鸟哥 Linux 私房菜》中提到过 ACL!这个是可以设置单个用户/组的访问权限!!没想到鸟哥的那本书时隔几年后竟然又起了作用,泪目。

所以我们应该设置 /home/allen/test.html 这个文件可以被 http 访问,但对其他的 other 不能,这不就是 ACL 的作用吗!

ACL 具体讲解我不说了,请查看《鸟哥》,这本书讲的非常好!我的解决方式如下。

# 设置路径上的各个目录/文件的 mask 为 rwx
setfacl -m m::rwx /home
setfacl -m m::rwx /home/allen
setfacl -m m::rwx /home/allen/test.html
# 设置路径上的各个目录/文件的 访问权限
setfacl -m u:http:rx /home
setfacl -m u:http:rx /home/allen
setfacl -m u:http:r  /home/allen/test.html

Comments