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

Tim*_*Tim 87 apache configuration symlink apache2

我在Ubuntu上设置Apache时遇到了一些麻烦.我一直在关注这个指南.

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

我的公共目录/ 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
Run Code Online (Sandbox Code Playgroud)

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

Forbidden

You don't have permission to access /about on this server.
Run Code Online (Sandbox Code Playgroud)

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

[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
Run Code Online (Sandbox Code Playgroud)

我知道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>
Run Code Online (Sandbox Code Playgroud)

知道我可能错过什么吗?

pal*_*int 124

检查Apache是​​否具有执行权限/root,/root/site以及/root/site/about.

跑:

chmod o+x /root /root/site /root/site/about
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我不是说它不起作用,但总的来说,在/ root上给o + x不是个好主意;) (37认同)
  • 米哈尔是对的.我发现我可以使用ACL(至少在Mac中):`chmod -R + a"_www allow list,search,readattr"/ root/root/site/root/site/about`,将这些权限授予*just*apache应用程序(_www),比"其他"更安全一点. (11认同)
  • 非常感谢...我没有意识到父目录也必须是可执行的. (8认同)

use*_*904 18

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

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

sudo -u www-data ls -l /var/www/html/<your symlink>/
Run Code Online (Sandbox Code Playgroud)

有解决方法/解决方案,例如将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
Run Code Online (Sandbox Code Playgroud)

启动后台服务:

lsyncd -delay 1 -rsync /home/<me>/<work folder>/ /var/www/html/<web folder>/
Run Code Online (Sandbox Code Playgroud)

  • `sudo -u www-data ...`是检查是否存在权限问题的好方法!请注意,根据您的发行版,用户可能是www-data,apache或其他内容. (2认同)

Rig*_*key 14

我有一个类似的问题,我在新服务器上很长时间都无法解决.除了palacsint的答案,一个很好的问题是:你使用的是Apache 2.4吗?在Apache 2.4中,有一种不同的机制来设置使用上述配置完成时不起作用的权限,因此我使用了此博客文章中解释解决方案.

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

Alias /demo /usr/demo/html

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

</Directory>
Run Code Online (Sandbox Code Playgroud)

至:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
Run Code Online (Sandbox Code Playgroud)

注意Orderallow行是如何被Require all grant替换的


Eli*_*jah 10

正如 Arch wiki 上的讨论所建议的为其他组设置整个路径的默认方法是:

chmod o+x /root /root/site /root/site/about
Run Code Online (Sandbox Code Playgroud)

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

最好,您应该使用 ACL 权限为特定用户设置权限。在 Apache HTTP 服务器的情况下,该用户将是“http”(取决于发行版,它可能是“www-data”(基于 debian)或“apache”(基于 redhat)),并且可以设置权限通过执行以下操作(在 arch 中,您将需要acl安装该软件包):

setfacl -m "u:http:--x" /path/to/directory
Run Code Online (Sandbox Code Playgroud)

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

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

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

zfs set acltype=posixacl your_zpool
Run Code Online (Sandbox Code Playgroud)

然后,通过重新启动计算机,将使用正确的配置再次安装该卷,并且上面的代码将起作用。


小智 7

与这个问题相关,我只知道为什么我的vhost给了我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>
Run Code Online (Sandbox Code Playgroud)

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

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes -FollowSymLinks -Includes
(...)
Run Code Online (Sandbox Code Playgroud)

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

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes +FollowSymLinks -Includes
(...)
Run Code Online (Sandbox Code Playgroud)

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