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