仅当存在合适的文档根目录时才使用 VirtualDocumentRoot

Pau*_*xon 8 virtualhost apache-2.2

我想建立一个环境,可以在不重新加载配置的情况下动态创建 Apache 虚拟主机。

我可以用mod_vhost_alias做到这一点,我设置了我的默认虚拟主机这样的

<VirtualHost *>
  UseCanonicalName Off
  VirtualDocumentRoot /var/www/sandboxes/domains/%0
  ServerName catchall.host
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但如果请求当前未设置的主机名,我会收到 404 Not Found 错误。

真正想做的是仅当文档根存在时才启动这个 VirtualHost ,否则让它尝试匹配另一个虚拟主机(换句话说,使VirtualDocumentRoot的存在以与使用相同的方式工作服务器别名)

我尝试将其设为第二个 vhost,第一个 vhost 仅处理所有请求,但这不起作用 - 对配置 VirtualDocumentRoot 的域的请求落入默认 vhost。

那么,我怎样才能动态配置虚拟主机,但对于任何尚未配置的虚拟主机,又可以回退到另一个虚拟主机呢?

Pau*_*xon 8

我找到了一个对我有用的解决方法。

我可以使用ErrorDocument来获取 PHP 脚本中的 404 错误。起初,这似乎有问题。如果没有 DocumentRoot,脚本会在哪里?

我可以使用来自不同域的错误消息的 URL。但是,在测试中我发现无法知道最初请求的域是什么。

答案是给Alias一个目录并从中处理错误,所以我的 vhost 看起来像这样

<VirtualHost *>
  UseCanonicalName Off
  VirtualDocumentRoot /var/www/sandboxes/domains/%0
  ServerName catchall.host
  Alias /errors /var/www/default/errors/
  ErrorDocument 404 /errors/notfound.php
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

现在,当请求未配置的域时,会调用 /var/www/default/errors/notfound.php 中的脚本。此脚本可以检查 $_SERVER['HTTP_HOST'] 以查看请求的域。如果它被实际配置,那么我们有一个常规的 404。如果它没有配置,我们可以显示一些替代错误消息。就我而言,这是我显示 UI 以帮助设置 vhost 的地方。