Apache不会遵循符号链接(403 Forbidden)

时间:2011-09-11 21:27:40

标签: apache configuration apache2 symlink

我在Ubuntu上设置Apache时遇到了一些麻烦。我一直关注this guide

# /usr/sbin/apache2 -v
Server version: Apache/2.2.17 (Ubuntu)
Server built:   Feb 22 2011 18:33:02

我的公共目录/ var / www可以成功提供并执行放在其中的PHP页面。但是,我想在/ var / www中创建一个符号链接,指向我的主文件夹中的目录并在那里提供页面。

[root /var/www]# ll
total 36
drwxr-xr-x  3 root root 4096 2011-09-11 14:22 .
drwxr-xr-x 14 root root 4096 2011-06-04 22:49 ..
lrwxrwxrwx  1 root root   16 2011-09-11 13:21 about -> /root/site/about

当我尝试在浏览器上访问/关于我时,

Forbidden

You don't have permission to access /about on this server.

据我所知,我为我想要提供的文件提供了足够的权限:

[root ~/site/about]# ll
total 24
drwxr-xr-x 5 root root 4096 2011-09-11 13:20 .
drwxr--r-- 3 root root 4096 2011-09-11 13:19 ..
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 contact
-rwxr-xr-x 1 root root 1090 2011-09-11 13:19 index.php
drwxr-xr-x 2 root root 4096 2011-09-11 13:20 me
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 resume

我知道FollowSymLinks选项,我相信它是在我的/ etc / apache2 / sites-enabled / 000-default文件中设置的:

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options FollowSymLinks Indexes MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

知道我可能缺少什么吗?

11 个答案:

答案 0 :(得分:121)

检查Apache是​​否具有/root/root/site/root/site/about的执行权限。

执行命令

chmod o+x /root /root/site /root/site/about

答案 1 :(得分:16)

403错误也可能是由加密文件系统引起的,例如加密的主文件夹的符号链接

如果您的符号链接指向加密文件夹,即使正确设置了apache和文件/文件夹权限,apache用户(例如www-data)也无法访问内容。可以通过以下呼叫测试 www-data 用户的访问权限:

sudo -u www-data ls -l /var/www/html/<your symlink>/

有解决方法/解决方案,例如将 www-data 用户添加到您的私人组(将加密数据公开给Web用户)或设置未加密的rsynced文件夹(可能相当安全)。我自己可能会在开发过程中使用rsync解决方案。

https://askubuntu.com/questions/633625/public-folder-in-an-encrypted-home-directory

出于我的目的,一个方便的工具是 lsyncd 。这允许我直接在我的加密主文件夹中工作,并且能够在apache网页中几乎立即看到更改。同步由文件系统中的更改触发,调用rsync。由于我只处理相当小的网页和脚本,因此同步速度非常快。我决定在rsync启动之前使用1秒的短暂延迟,即使可以设置 0秒的延迟

安装lsyncd(在Ubuntu中):

sudo apt-get install lsyncd

启动后台服务:

lsyncd -delay 1 -rsync /home/<me>/<work folder>/ /var/www/html/<web folder>/

答案 2 :(得分:10)

我遇到了类似的问题,我在新服务器上很长时间都无法解决这个问题。除了palacsint的回答,一个很好的问题是:你使用的是Apache 2.4吗?在Apache 2.4中,有一种不同的机制来设置使用上述配置完成后不起作用的权限,因此我使用了solution explained in this blog post

基本上,我需要做的是转换我的配置文件:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    allow from all

</Directory>

为:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

请注意订单允许行如何被需要全部授予

替换

答案 3 :(得分:6)

与此问题相关,我只知道为什么我的虚拟主机给了我403.

我已经测试过这个问题的所有可能性而其他人没有运气。这几乎让我很生气。

我正在通过符号链接设置类似于Capistrano的发布部署服务器,当我尝试访问DocRoot文件夹(现在是当前版本文件夹的符号链接)时,它给了我403.

我的vhost是:

DocumentRoot /var/www/site.com/html
<Directory /var/www/site.com/html>
        AllowOverride All
        Options +FollowSymLinks
        Require all granted
</Directory>

我的主要httpd.conf文件是(默认Apache 2.4安装):

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes -FollowSymLinks -Includes
(...)

事实证明,主要的选项定义优先于我的vhosts fiel(对我来说这是反直觉的)。所以我把它改成了:

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes +FollowSymLinks -Includes
(...)

和尤里卡! (注意MAIN httpd.conf文件中FollowSymLinks之前的加号。 希望这有助于其他一些失落的灵魂。

答案 4 :(得分:1)

对于升级到14.04后遇到问题的人 https://askubuntu.com/questions/452042/why-is-my-apache-not-working-after-upgrading-to-ubuntu-14-04 如 根改变了 在升级之前= / var / www 升级后= / var / www / html

答案 5 :(得分:1)

正如我在我的情况中发现的那样,还有另一种方式可能会使符号链接失败。如果您有一个SELinux系统作为服务器,并且符号链接指向NFS安装的文件夹(其他文件系统可能会产生类似的症状),httpd可能会看到错误的上下文并拒绝提供目标文件夹的内容

在我的情况下,/var/www/html的SELinux上下文(您可以使用ls -Z获得)是unconfined_u:object_r:httpd_sys_content_t:s0/var/www/html中的符号链接将具有相同的上下文,但其目标的上下文(作为NFS挂载的文件夹)为system_u:object_r:nfs_t:s0

解决方案是将fscontext=unconfined_u:object_r:httpd_sys_content_t:s0添加到mount选项(例如# mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>)。 rootcontext无关紧要,NFS拒绝defcontext。我没有单独尝试context

答案 6 :(得分:1)

首先禁用selinux(vim / etc / selinux / config)

vim /etc/httpd/conf/httpd.conf编辑符号链接和目录索引的以下行:

documentroot /var/www/html
<directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride None
</directory>

如果.htaccess文件然后是AllowOverride all

答案 7 :(得分:1)

正如 Arch wiki 上的 this 讨论所推荐的那样,为其他组设置整个路径的默认方法是:

chmod o+x /root /root/site /root/site/about

不是最安全的方式,因为任何有权访问服务器的用户都可以访问和执行公开路径上的文件。

最好使用 ACL 权限为特定用户设置权限。 在 Apache HTTP 服务器的情况下,该用户将是“http”,并且可以通过执行设置权限(在 arch 中,您将需要安装 acl 包):

setfacl -m "u:http:--x" /path/to/directory"

您必须递归地设置它(首先设置为 /path,然后设置为 /path/to 等)。

与投票最多的解决方案相比,只有特定用户才能访问此目录,因此提高了安全性。

额外提示:如果路径安装在 zfs 池上,则需要在 zpool 配置中添加选项 acltype。这可以通过以下方式完成:

zfs set acltype=posixacl your_zpool

然后,通过重新启动机器,将使用正确的配置再次挂载卷,并且上面的代码将起作用。

答案 8 :(得分:0)

除了如其他答案所示更改权限外,我还必须重新启动apache才能使其生效:

sudo service apache2 restart

答案 9 :(得分:0)

如果您需要KeyMap,还有另一个隐患:

在fs树深处的某个地方,一个旧的declaration具有

AllowOverride All

代替

.htaccess

是非决定性地禁用服务器配置中设置的Options Indexes并在此处造成神秘403的全部原因。

答案 10 :(得分:0)

启用选项FollowSymLinks:

$ rg "FollowSymLinks" /etc/httpd/
/etc/httpd/conf/httpd.conf
269:    Options Indexes FollowSymLinks

您需要symlink中的所有目录都可以由用户httpd使用。

因此对于这种一般用例:

cd /path/to/your/web
sudo ln -s $PWD /srv/http/

您可以使用namei检查所有者的权限:

$ namei -m /srv/http/web
f: /srv/http/web
 drwxr-xr-x /
 drwxr-xr-x srv
 drwxr-xr-x http
 lrwxrwxrwx web -> /path/to/your/web
   drwxr-xr-x /
   drwxr-xr-x path
   drwx------ to
   drwxr-xr-x your
   drwxr-xr-x web

在我的情况下,to目录仅对我的用户可执行:

启用其他人的执行即可解决该问题:

chmod o+x /path/to

请参见不可执行的目录可能有所不同,或者您需要影响组而不是其他,这取决于您的情况。