Debian、Apache、403 禁止错误和加密驱动器

Debian、Apache、403 禁止错误和加密驱动器

我已经在本地 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 上有很多相关信息,但我可以推荐:

从命令行挂载加密卷

启动时挂载 LUKS 分区

相关内容