我安装了全新的 CentOS 6,它的文档根目录中有一个指向我的开发文件的符号链接:
[root@localhost html]# ls -l
total 4
-rwxrwxrwx. 1 root root 0 Sep 18 20:16 index.html
-rwxrwxrwx. 1 root root 17 Sep 18 20:16 index.php
lrwxrwxrwx. 1 root root 24 Sep 18 20:19 refresh-app -> /home/billy/refresh-app/
我的 httpd.conf 有这个:
<Directory "/">
Options All
AllowOverride None
Order allow,deny
Allow from all
</directory>
符号链接的目标具有允许 apache 读取它想要的任何内容的权限:
[root@localhost billy]# ls -l
total 40 (Some entries were omitted because the list was too long
drwxr-xr-x. 7 billy billy 4096 Sep 18 20:03 refresh-app
我也尝试通过以下方式禁用 SELinux /etc/selinux/conf
:
SELINUX=disabled
然而,无论我做什么,当有人尝试访问该链接时,http://localhost/refresh-app/
我都会收到 403 FORBIDDEN 错误页面,这写在/var/log/httpd/error_log
:
Symbolic link not allowed or link target not accessible
为什么 Apache 无法访问符号链接的目标?
答案1
发现问题了。事实证明,Apache 不仅希望访问我正在服务的目录/home/billy/refresh-app/
,还希望访问该目录之上的每个目录,即/home/billy/
、/home
和/
。 (我不知道为什么......授予某人访问子目录的权限不需要放弃对该子目录之上所有内容的权限......)
我猜它正在寻找.htaccess
某种东西,或者也许 *nix 对于它如何处理目录遍历的权限感到很奇怪。
答案2
我遇到了类似的问题,我有以下配置,该配置曾经适用于 Ubuntu 10,但停止适用于 Ubuntu 14 (Apache 2.4):
<Directory /var/www/vhosts/example.com/httpdocs>
Options +FollowSymLinks
</Directory>
切换到这个解决了问题(即使网络服务器用户无法直接访问符号链接)
<Directory /var/www/vhosts/example.com/httpdocs>
Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
</Directory>
据我所知,这只是设置-SymLinksIfOwnerMatch
,与 Apache 2.4 中的更改有关,但我还没有尝试研究确切的原因。
我还认为这可能是由于openbase_dir
PHP 的限制,但事实并非如此。
答案3
如果您链接到加密文件夹,也可能会导致此错误。
答案4
看来“FollowSymLinks”是您在 httpd.conf 中需要的选项。是详细的这里。看起来您可能也需要 htdocs 中的规则...但这正是您需要的选项。