如果子域不存在

如果子域不存在

apache2 中有没有办法为不存在的子域添加虚拟主机?

现在我尝试这个:

<VirtualHost *:80>
        ServerAdmin [email protected]

        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log


</VirtualHost>

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName *.devhouse.nl
        DocumentRoot /var/www/errors
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/errors/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

</VirtualHost>

Include sites-available/devhouse.nl.vhost

(第二个虚拟主机)

但这不起作用。我看到文件在 /var/www 中,而不是在 /var/www/errors 中

我怎样才能解决这个问题?

答案1

您可以创建一个默认的 VirtualHost,只要没有配置匹配的 NamedVirtualHost,就会触发该 VirtualHost。这基本上类似于您给出的第一个示例。然后,为要处理的所有域添加 NamedVirtualHost(例如添加ServerName www.example.com等)。

每当请求未配置的虚拟主机时,默认将为该请求提供服务。在此,您可能希望显示特定内容和/或触发重定向到现有(或不同的)服务器。

您可能需要NameVirtualHost *:80在 VirtualHost 块之前进行声明。

答案2

如果NameVirtualHost *:80您的配置文件中还没有类似的内容,则必须添加。当您的 VirtualHosts 使用相同的 IP 地址和端口(您的 IP 地址和端口也是相同的)时,这是必需的。这告诉 Apache 它应该使用 HTTP 请求中的 Host: 标头来选择哪个 VirtualHost 应该处理该请求。

如果您使用 NameVirtualHost,则每个 VirtualHost 中还必须有一个 ServerName 指令。这是 Apache 将 Host: 标头与之匹配的内容。ServerName 指令不能包含 * 字符。ServerName 必须与您的域完全匹配。如果您想匹配 www.devhouse.nl 以及 devhouse.nl,那么您将需要一个 ServerAlias 指令。您可以拥有任意数量的 ServerAlias 指令,但只能有一个 ServerName。

ServerName devhouse.nl
ServerAlias www.devhouse.nl
ServerAlias mail.devhouse.nl

包含上述内容的 VirtualHost 将匹配发送到这三个域之一的 HTTP 请求。任何其他请求都将转到默认 VirtualHost。

配置文件中列出的第一个 VirtualHost 将成为默认 VirtualHost。如果请求与其他 VirtualHost 不匹配,它将处理该请求。如果您希望第二个列出的 VirtualHost 成为默认 VirtualHost,则必须在文件中交换它们。

Apache 关于此的文档非常好:http://httpd.apache.org/docs/2.2/vhosts/examples.html

您可以让 Apache 列出您的虚拟主机以及它们使用命令的顺序apachectl -S (大写 S)

结尾Include看起来很奇怪。列表的第一部分是包含文件的内容吗?

如果这一切太过复杂,无法一次性全部吸收,那么您需要执行以下操作:

  1. 交换两个 VirtualHosts。
  2. 放在NameVirtualHost *:80他们两人面前。
  3. *.从 ServerName 指令中删除或www. 用您想要匹配的域替换它。默认 VirtualHost 中具体是什么并不重要。
  4. 向第二个 VirtualHost 添加 ServerName 指令和(可选)一些 ServerAlias 指令。

相关内容