我正在从 Apache 2.2 迁移到 2.4,并且无法再访问不在文档根目录中的文件——这是一个典型的别名问题。我已经阅读了许多关于此问题的相互冲突的帖子,并根据 Apache 官方文档的建议对别名的使用进行了更改,但它仍然不起作用。我已将日志记录级别设置为最详细,即在 /etc/apache2/sites-enabled/000-default.conf 和 /etc/apache2.conf 中进行调试,以尝试解决问题。
我有一个网页尝试访问两台机器上 /var/tmp 上的 foo.txt 。我可以使用 2.2 很好地访问它,但出现错误,使用 2.4 在此服务器上找不到请求的 URL。我在 2.2 上的 /etc/apache2/sites-enabled/default.conf 和 2.4 上的 000-default.conf 中使用别名来访问该文件夹,并且我已在目录块中定义了该文件夹。
我在 2.4 的 000-default.conf 中使用它:
''' <VirtualHost *:8000> ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/tmp/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
Header set Access-Control-Allow-Origin "*"
</Directory>
Alias /Dummy/ /var/tmp/
LogLevel debug
'''
我认为问题可能是权限,因为这通常是一个问题。在 2.2 机器上,我在文件夹上只有 root root,它工作正常(ls -all -d /var/tmp):
drwxrwxrwt 6 root root 2200 十月 24 16:41 /var/tmp
和(ls -all /var/tmp/foo.txt):
-rw-r--r-- 1 root root 805 十月 24 16:42 foo.txt
到我试图访问该文件夹中的文件。
由于这在 2.4 的机器上不起作用,我对文件夹尝试了以下操作:
drwxrwxrwt 9 www-data www-data 1440 十月 24 16:44 /var/tmp
这是我试图在该文件夹中访问的文件:
-rw-r--r-- 1 www-data www-data 836 十月 24 16:45 foo.txt
第一个示例在 2.2 上运行良好,但第二个示例在 2.4 上失败,给我:
未找到。在此服务器上找不到所请求的 URL。
在 /var/log/apache2/access.log 我得到:
IP 地址 - - [24/Oct/2020:16:47:02 -0400] "GET /Dummy/foo.txt HTTP/1.1" 404 497 "-" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML) ,如 Gecko)Chrome/49.0.2623.112 Safari/537.36"
在 /var/log/apache2/error.log 我得到:
''' [Sat Oct 24 16:52:01.154485 2020] [authz_core:debug] [pid 32675] mod_authz_core.c(820): [客户端 IP 地址:34306] AH01626: 要求全部授予的授权结果: 已授予
[Sat Oct 24 16:52:01.155003 2020] [authz_core:debug] [pid 32675] mod_authz_core.c(820): [客户端 IP 地址:34306] AH01626: 授权结果:已授予
[2020 年 10 月 24 日星期六 16:52:01.155659] [core:info] [pid 32675] [客户端 IP 地址:34306] AH00128: 文件不存在: /var/tmp/foo.txt '''
我使用的网址是:
http://IP地址:8000/Dummy/foo.txt
我尝试将尾随 / 保留在别名中,但出现权限错误而不是未找到,因此我恢复了尾随 /。每次更改配置文件后我都会重新启动 apache2。
是的,目标文件确实存在。我还没有触及默认的 .htaccess 文件。
我怎样才能解决这个问题 ???
答案1
我怀疑您不仅要更改为 apache 2.4,而且 apache 2.4 由 systemd 运行,并且 apache2.service systemd 文件包含PrivateTmp=true
这意味着,它将拥有自己的/tmp
并且/var/tmp
与系统分离(请参阅系统执行(5))。
apache看到/var/tmp
的实际上会存在于/var/tmp/systemd-private-<long hash>-apache2.service-f00WPn/tmp
解决方案是禁用该指令或将文件放置在不同的文件夹中。如果文件是由另一个守护进程创建的,您可以使用JoinsNamespaceOf=
指令让两者共享相同的/tmp
文件/var/tmp