Apache不会遵循符号链接(禁止使用403)


90

我在Ubuntu上设置Apache时遇到了一些麻烦。我一直在遵循本指南

# /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

当我尝试在浏览器上访问/ 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>

知道我可能会缺少什么吗?

Answers:


126

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

跑:

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

8
非常感谢...我没有意识到父目录也必须是可执行的。
蒂姆(Tim)

39
好吧,我不是说这行不通,但是总的来说,在/ root上加上o + x并不是一个好主意;)
Michal Rzemieniecki 2012年

11
米哈尔是对的。我发现我可以使用ACL(至少在Mac 中是这样):,chmod -R +a "_www allow list,search,readattr" /root /root/site /root/site/about将这些权限授予apache应用(_www),这比“ other”安全一些。
James S

1
在Mac OS(10.9.4)上,我的〜/ Documents没有执行权,并且我有一个git repo可以托管我的站点文件。在〜/ Documents上授予chmod o + x可以达到目的!谢谢!
Ernani Joppert 2014年

1
终于得到答案了!谢谢。
whoan

21

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

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

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

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

/ubuntu/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>/

3
sudo -u www-data ...是检查权限问题的好方法!请注意,取决于您的发行版,用户可以是www-data,apache或其他名称。
mkasberg

啊,终于!我已经在怀疑自己最基本的能力!
kalabalik '17

浪费了数小时,最后还是加密了!
myol

15

我遇到了类似的问题,长时间无法在新服务器上解决。除了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>

至:

Alias /demo /usr/demo/html

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

注意如何订购允许行替换为“ 需要全部授予”


请注意,大多数计算机上仍然可以使用“订购/允许/拒绝”命令。在较新的版本中,它是在access_compat模块中实现的。如果启用了该模块,则第一部分不太可能按预期工作。如果不存在,那么尝试启动Apache2应该会失败并显示错误。
亚历克西斯·威尔克

哪个配置?在/etc/httpd/conf/httpd.conf没有我的系统上存在的,而且,该目录/etc/httpd/不存在。
亚伦·弗兰克

@AaronFranke您安装了Apache吗?可能在这里:/etc/apache2/httpd.conf /etc/apache2/apache2.conf /etc/httpd/httpd.conf /etc/httpd/conf/httpd.conf
RightHandedMonkey

是的,我已经安装了Apache,并且在Ubuntu上。/etc/apache2/apache2.conf对我来说存在。
亚伦·弗兰克

7

与此问题相关,我只是想出了为什么我的虚拟主机给我那个403。

我已经测试了这个问题以及其他所有没有运气的可能性。这几乎使我发疯。

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

我的虚拟主机是:

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
(...)

事实证明,主要的选项定义优先于我的虚拟主机(对我而言,这很直观)。所以我将其更改为:

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

和尤里卡!(请注意MAIN httpd.conf文件中FollowSymLinks之前的加号。希望这对其他迷路者有所帮助。


在Apache 2.4中,您的解决方案将使配置无效,并且httpd无法启动,因为您无法在单个“选项”行中组合“ +”和“-”。
deesto

是的,尽管我已经在文件中声明了“ DocumentRoot”为“更早”,但是它覆盖了
子目录的子目录

2

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

就我而言,/var/www/html(您可以通过获取ls -Z)的SELinux上下文是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:s0mount选项(例如# mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>)。rootcontext是无关紧要的,defcontext并被NFS拒绝。我没有自己尝试context


2

首先禁用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文件,则全部允许覆盖


如果/etc/httpd/我的系统上没有该文件夹怎么办?
亚伦·弗兰克


1

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

sudo service apache2 restart

0

如果需要,还有另一个细微的陷阱AllowOverride All

某处深的FS树,老.htaccess

    Options Indexes

代替

    Options +Indexes

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.