我有一个生成 Apache 2 配置块的工具。我希望它生成的内容与实际的 ServerName 无关,但不需要实际在目标机器的 Apache 配置上运行/解析。
换句话说,我需要的是这样的:
<VirtualHost *>
ServerName foobar // <-- no top level domain
...
</VirtualHost>
从阅读文档来看,ServerName 字段似乎必须始终是完全限定域名,因此在不知道目标服务器的 FQDN 的情况下,本质上无法写入 vhost 块。这是真的吗?还是有一些解决方法?
答案1
是的,ServerName
必须是真实的服务器标识,但也可以是 IP 地址。
ServerAlias
另一方面可以包含通配符。
文档提到了这一点。
但它也表示,这不是必需的
如果未指定 ServerName,服务器将尝试通过首先向操作系统询问系统主机名来推断客户端可见的主机名,如果失败,则对系统上存在的 IP 地址执行反向查找。
答案2
既不是ServerName
也不是ServerAlias
是 VirtualHost 块中必需的指令。
您可以直接省略它们。
手册解释了何时执行此操作:
如果没有
ServerName
指定,服务器将尝试通过首先向操作系统询问系统主机名来推断客户端可见的主机名,如果失败,则对系统上存在的 IP 地址执行反向查找。
这可能正是您所需要的。
此外,在实践中这些指令也将接受几乎任何字符串...
单个单词(如localhost
或test
和)example
将起作用,看起来更像 FQDN 但不是实际工作的 DNS 名称的东西也将起作用,例如there.is.no.tld.named.serverfault.
使用类似的内容可能会导致错误日志中出现启动警告(您可以通过将该字符串添加到来避免/etc/hosts
),并且可能会导致 Apache httd 无法将您的 VirtualHost 块与任何其他现有块区分开来,并且您的设置将不会生效。https://httpd.apache.org/docs/2.4/vhosts/details.html