我有两个域johny.com
和alice.com
一个管理它们的网络服务器(apache)。Web 文件位于/var/www/johny.com
和中,/var/www/alice.com
并被配置为两个具有适当ServerName
和DocumentRoot
. 现在,Alice 想要保护她在网络上的一个文件不被任何人看到。她介绍了一个.htaccess
文件,内容如下
<Files "private.txt">
Require all denied
</Files>
并且还在她的虚拟主机的 apache 配置中添加了以下内容
<Directory /var/www/alice.com>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
并且没有人可以访问alice.com/private.txt
. 到目前为止,一切都很好。
现在 John 决定通过更改他的 vhost apache 配置来为 Alice 的 web 提供一个别名
Alias "/alice" "/var/www/alice.com"
任何人都可以在 上看到 Alice 的网页john.com/alice
。但是任何人也可以看到爱丽丝私人文件的内容。
alice.com/private.txt
给出 403 禁止。
john.com/alice/private.txt
显示文件的内容。
这是怎么回事?不通过指令AllowOverride
传播?Alias
我们应该如何解决这个问题?阿帕奇版本是Apache/2.4.38 (Debian)
. 将乱码放入.htaccess
文件中只会在 500 Internal Server Error 上给出 500 Internal Server Error alice.com
,而不是 on john.com/alice
,所以似乎.htaccess
根本不考虑别名。
问题是目录缺少
AllowOverride All
指令/var/www/alice.com
。具体来说,问题出在这里:(强调我的)
由于您在 Alice 的虚拟主机块中定义了这些目录权限,因此它们不适用,
john.com/alice
因为没有通过<VirtualHost>
与 Alice 对应的块的上下文访问该目录。就服务器而言,别名正在合法地访问文件系统中的某个目录。碰巧它与不同虚拟主机的根目录相同。从文档中:
但是,由于它与您的特定情况有关,重要的是要注意,只有
VirtualHost
在实际调用与所讨论的部分相对应的上下文时才会真正发生这种情况,而不是在这里。有几种方法可以解决这个问题。最简单的方法是在服务器上下文中简单地声明
AllowOverride All
指令(即..不在 a 、甚至另一个块中。VirtualHost
.htaccess
Directory
再次注意,因为您正在声明
AllowOverride All
,所以您现在可以在该目录中的文件中修改这些设置.htaccess
,而不管从哪个VirtualHost
上下文访问该目录。如果您想变得花哨,并且在
/var/www/alice.com
从的虚拟主机上下文中访问时死心塌地,您总是可以将uri 配置为'd to 。john.com
alice.com
john.com/alice
ProxyPass
http://alice.com
您需要为上述启用
mod_proxy
和mod_proxy_http
,但它会满足您对这个特定用例的要求,尽管我会小心依赖Location
指令,因为文档在详细描述方面做得很好。