我已经在本地 Debian 上设置了 Apache杰西安装但无法让我的 VirtualHost 工作。访问http://localhost
工作正常并向我展示有用!页。
但是当尝试访问时http://test
会显示 403 Forbidden 错误:
您没有权限访问此服务器上的 /。
我的配置看起来很常见:
<VirtualHost *:80>
DocumentRoot "/home/johndoe/web/test"
ServerName test
<Directory "/home/johndoe/web/test">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
答案1
前言:
发生这种情况的原因有很多,并且这个问题已经在 Stack Exchange 上被问过好几次了。然而,就我而言,没有一个答案(直接)解决了这个问题,或者基于错误或过时的信息。
其中许多(正确接受的)答案告诉我们将配置的DocumentRoot
目录以及所包含的文件和目录的权限或所有权递归地更改为www-data
.
但当谈论最新 Debian 或 Ubuntu 的本地安装时(例如,出于基本 Web 开发的目的),这可能不再需要了。
我们来看看日志吧!
由于错误页面本身只包含一条非常通用的消息,我们需要查看错误日志以获取更多信息:
sudo tail -f /var/log/apache2/error.log
该tail
命令将输出文件的最后 10 行,并使用该-f
选项确保输出在日志增长时更新。
日志告诉我们什么?
client denied by server configuration: /home/johndoe/web/test
这个很容易。正如所解释的Apache:客户端被服务器配置拒绝我们只需要使用Require all granted
设置更新我们的配置 - 所以它看起来像:
<VirtualHost *:80>
DocumentRoot "/home/johndoe/web/test"
ServerName test
<Directory "/home/johndoe/web/test">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
不要忘记使用以下命令重新启动 Apache:
sudo service apache2 restart
错误依然存在...
但日志消息已更改:
Symbolic link not allowed or link target not accessible: /home/johndoe/web/test
这个问题有点复杂,因为可能有多种原因。要找出真正的原因,一个好的开始是更新我们的配置,不使用包含符号链接的目标,而是直接指向目标。这/home/johndoe/web
是一个符号链接,/media/johndoe/crypt1/web
因此我们的配置现在如下所示:
<VirtualHost *:80>
DocumentRoot "/media/johndoe/crypt1/web/test"
ServerName test
<Directory "/media/johndoe/crypt1/web/test">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
固定了吗?
日志消息可能已更改为更具描述性的消息。就我而言,它显示:
access to / denied (filesystem path '/media/johndoe/crypt1') because search permissions are missing on a component of the path
如果您在此处看到另一条消息并且可能已经有了可行的解决方案,那么您在此处发表评论并链接相应的讨论会很棒,这样其他人也可能会找到正确的信息。
现在?
正如消息所示,Apache 无法完全访问该路径,因为无法遍历该路径的一个或多个组件。要查看哪个组件可能导致它,我们可以这样做:
namei -m /media/johndoe/crypt1/web/test/
该namei
命令分离并打印路径组件,并使用-m
选项以类似命令的样式显示每个组件的模式位ls -l
。
对我来说,输出如下:
f: /media/johndoe/crypt1/web/test/
drwxr-xr-x /
drwxr-xr-x media
drwxr-x--- johndoe
drwxr-xr-x crypt1
drwxr-xr-x web
drwxr-xr-x test
看来johndoe
目录是造成这里麻烦的原因。因此,在我们修改权限之前,chmod
让我们更好地仔细看看:
ls -ld /media/johndoe/
ls
带选项的命令将以-d
列表形式打印目录信息(而不是其内容)-l
。
对我来说它看起来像这样:
drwxr-x---+ 3 root root 4096 May 28 00:00 /media/johndoe/
正如你所看到的,+
那里有一个标志表明进一步访问控制列表参与。
这最终为我指明了正确的方向,因为我确信我没有设置任何前交叉韧带靠我自己。更重要的是,因为我什至没有自己设置媒体安装点,而是我使用 Nautilus 来加密和安装我的驱动器。
这可以解决问题:
因此,我现在手动挂载它,而不是让 Nautilus 弄乱我的挂载点:
1)如果已经挂载则卸载:
sudo umount /media/johndoe/crypt1
2)直接在下面创建一个挂载点/media
:
sudo mkdir /media/crypt1
3)查找设备映射以找出UUID:
ls -l /dev/mapper/
4)根据其安装设备:
sudo mount /dev/mapper/luks-<UUID> /media/crypt1
5) 相应地更新 Apache 配置和/或符号链接,例如:
ln -s /media/crypt1/web/ ~/web
笔记:
请记住,您需要在每次启动后加密并安装驱动器。 Stack Exchange 上有很多相关信息,但我可以推荐: