Apache不会遵循符号链接(403 Forbidden)
我在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中创build一个符号链接,指向我的主文件夹中的一个目录,并在那里提供页面。
[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>
任何想法,我可能会错过?
检查Apache是否拥有/root
, /root/site
和/root/site/about
执行权限。
跑:
chmod o+x /root /root/site /root/site/about
encryption的文件系统也可能导致403错误,例如encryption的主文件夹的符号链接。
如果符号链接指向encryption的文件夹,则apache用户(例如www-data)无法访问内容,即使正确设置了apache和文件/文件夹权限。 www-data用户的访问可以用这样的调用来testing:
sudo -u www-data ls -l /var/www/html/<your symlink>/
有解决方法/解决scheme,例如,将www-data用户添加到您的私人组(将encryption数据公开给Web用户)或设置未encryption的rsynced文件夹(可能相当安全)。 我自己可能会在开发过程中使用rsync解决scheme。
https://askubuntu.com/questions/633625/public-folder-in-an-encrypted-home-directory
为我的目的一个方便的工具是lsyncd 。 这使我可以直接在encryption的主文件夹中工作,并能够在apache网页中立即看到变化。 同步由文件系统中的更改触发,调用rsync。 由于我只是在相当小的网页和脚本上工作,所以同步速度非常快。 我决定在rsync启动之前使用1秒的短暂延迟,尽pipe可以设置延迟0秒 。
安装lsyncd(在Ubuntu中):
sudo apt-get install lsyncd
开始后台服务:
lsyncd -delay 1 -rsync /home/<me>/<work folder>/ /var/www/html/<web folder>/
我有一个类似的问题,我无法在新服务器上解决很长时间。 除了palacsint的回答,还有一个很好的问题是:你使用的是Apache 2.4吗? 在Apache 2.4中,有一个不同的机制来设置使用上述configuration时不起作用的权限,所以我使用了本博客中解释的解决scheme 。
基本上,我需要做的是从我的configuration文件转换:
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>
请注意订单和允许行已经被Require all全部取代
与这个问题有关,我只是想出了为什么我的虚拟主机给了我这个403。
我已经testing了这个问题的所有可能性,其他人没有运气。 这几乎让我发疯。
我正在通过符号链接设置一个类似于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 (...)
事实certificate,主要的选项定义是优先于我的虚拟场(对我来说是反直觉)。 所以我把它改为:
DocumentRoot "/var/www" <Directory "/var/www"> Options -Indexes +FollowSymLinks -Includes (...)
和尤里卡! (注意MAIN httpd.conf文件中的FollowSymLinks之前的加号,希望这有助于其他一些失去灵魂。
对于升级到14.04之后出现问题的人,在升级之前更改root = / https://askubuntu.com/questions/452042/why-is-my-apache-not-working-after-upgrading-to-ubuntu-14-04升级后的var / www = / var / www / html
先禁用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全部
还有另外一种符号链接可能会让你失望,就像我在我的情况中发现的那样。 如果您有一个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
。
解决scheme是将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
。