2011-09-11 47 views
75

我在Ubuntu上设置Apache时遇到了一些麻烦。我一直在关注this guideApache不会遵循符号链接(403 Forbidden)

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

任何想法我可能会失踪?

回答

112

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

执行命令

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

非常感谢......我没想到的父目录也必须是可执行的。 – Tim

+31

嗯,我没有告诉它不会工作,但总的来说,在/ root上给o + x不是一个好主意;) –

+10

Michal是对的。我发现我可以使用ACL(至少在Mac中):'chmod -R + a“_www允许列表,搜索,readattr”/ root/root/site/root/site/about“,这些权限授予* * apache应用程序(_www),比“其他”更安全。 –

7

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

注意订单如何让系已由取代要求一切准予

+0

请注意,Order/Allow/Deny命令在大多数计算机上仍然可用。在更新的版本中,它在'access_compat'模块中实现。如果启用该模块,则第一部分不可能按预期工作。如果它不在那里,那么尝试启动Apache2应该会失败并出错。 –

4

与这个问题有关,我只是想出了为什么我的虚拟主机给了我那个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 
(...) 

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

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

和尤里卡! (注意:在主httpd.conf文件的FollowSymLinks前的加号。 希望这会帮助其他一些迷失的灵魂。

+0

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

0

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

在我的情况下SELinux上下文/var/www/html(您可以从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不相关,defcontext被NFS拒绝。我本身并没有尝试context

0

首先禁用SELinux(VIM的/ etc/selinux的/配置)以下为符号链接线和目录索引

VIM /etc/httpd/conf/httpd.conf中编辑:

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

如果htaccess的然后AllowOverride全部

11

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

如果符号链接指向加密文件夹,即使apache和文件/文件夹权限设置正确,apache用户(例如www-data)也无法访问内容。所述www数据用户可以与这样的呼叫进行测试的访问:

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

有变通/这一解决方案,例如将www-data用户添加到您的私人组(将加密数据公开给网络用户)或设置未加密的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

'sudo -u www-data ...'是检查是否存在权限问题的好方法!请注意,根据您的发行版,用户可能是www-data,apache或其他内容。 – mkasberg

+0

终于!我已经怀疑我最基本的能力了! – kalabalik

+0

失去了这个小时,最后是加密! – myol