Apache 默认虚拟主机

Posted

技术标签:

【中文标题】Apache 默认虚拟主机【英文标题】:Apache default VirtualHost 【发布时间】:2011-07-22 14:14:01 【问题描述】:

如何在 Apache 中设置默认的 VirtualHost?

最好,我希望默认主机与 IP 地址主机不一样。现在我有这样的东西:

NameVirtualHost *

<VirtualHost *>
    ServerAdmin admin@domain.com
    DocumentRoot /someOtherDir/
    ServerAlias ip.of.the.server
</VirtualHost>

<VirtualHost *>
    ServerAdmin admin@domain.com
    DocumentRoot /someroot/
    ServerAlias domain.com *.domain.com
</VirtualHost *>

如果域被转发到我的服务器,但不在此 vhost.conf 文件中,则 /someOtherDir/ 中的文件会按预期加载。但我希望能够为 IP 地址本身和尚未添加到 vhost.conf 文件中的域使用不同的根。这可能吗?

【问题讨论】:

【参考方案1】:

我找到了答案:我记得如果没有找到其他匹配的块,Apache 会使用第一个块,所以我在块的顶部添加了一个没有serveralias 的块:

NameVirtualHost *

<VirtualHost *>
    DocumentRoot /defaultdir/
</VirtualHost>

<VirtualHost *>
    ServerAdmin admin@domain.com
    DocumentRoot /someOtherDir/
    ServerAlias ip.of.the.server
</VirtualHost>

<VirtualHost *>
    ServerAdmin admin@domain.com
    DocumentRoot /someroot/
    ServerAlias domain.com *.domain.com
</VirtualHost>

【讨论】:

实际上 - 我必须将 ServerName fake.example.com 添加到“默认”虚拟主机中。 文件的顺序发生了变化(按字母顺序排序),所以我的默认设置突然停止工作。我建议将配置放在000-default.conf 文件中。 在我将端口号设置为 80 之前没有为我工作。即。 而不仅仅是 。我在 CentOS 7 上使用 Apache 2.4。【参考方案2】:

如果您使用的是 Debian 风格的虚拟主机配置(站点可用/站点启用),设置默认虚拟主机的一种方法是首先在 httpd.conf 或 apache.conf 中包含特定的配置文件(或以前的您的主配置文件)。

# To set default VirtualHost, include it before anything else.
IncludeOptional sites-enabled/my.site.com.conf

# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf

# Load virtual host config files from "/etc/httpd/sites-enabled/".
IncludeOptional sites-enabled/*.conf

【讨论】:

【参考方案3】:

这里的其他答案对我不起作用,但我找到了一个非常简单的解决方案。

我将默认的设置为列出的最后一个,我给了它ServerAlias *

例如:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName www.secondwebsite.com
    ServerAlias secondwebsite.com *.secondwebsite.com
    DocumentRoot /home/secondwebsite/web
</VirtualHost>

<VirtualHost *:80>
    ServerName www.defaultwebsite.com
    ServerAlias *
    DocumentRoot /home/defaultwebsite/web
</VirtualHost>

如果访问者没有明确选择访问以secondwebsite.com 结尾的内容,他们将获得默认网站。

【讨论】:

请注意,通配符别名不会使主机成为默认主机。默认仍然是定义的第一个主机,它有副作用。例如,如果第一个主机使用 SSLStrictSNIVHostCheck,那么这将适用于所有主机,这是令人惊讶的。最好定义一个假主机,确保它是第一个,因此它将成为默认值,然后使用通配符别名,必须最后定义,用于您要处理任何不匹配的主机。【参考方案4】:

我会说什么对我有用,上面的其他答案对我的情况根本没有帮助。我希望它可以帮助某人。

实际上,我在带有 Apache/2.4.39(亚马逊)的 EC2 Linux AMI 上使用虚拟主机配置(站点可用/站点启用)。所以,我有 1 个 ec2 实例来服务许多站点(域)。

考虑到您已经安装并运行了虚拟主机。在我的文件夹 /etc/httpd/sites-available 中,我有一些带有域名(后缀为 .conf)的文件,例如:domain.com.conf。像这样创建一个新文件。

sudo nano /etc/httpd/sites-available/domain.com.conf

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias domain.com
    DocumentRoot /var/www/html/domain
</VirtualHost>

对于sites-available 中的每个file.conf,我创建了一个符号链接:

sudo ln -s /etc/httpd/sites-available/domain.com.conf /etc/httpd/sites-enabled/domain.com.conf

这是默认配置,所以如果直接通过服务器的IP访问,你将被重定向到sites-available文件夹中第一个文件(.conf)的DocumentRoot,按文件名排序。

要在通过 IP 访问时有一个 默认 DocumentRoot 文件夹,您必须创建一个名为 0a.conf 的文件,然后 apache 将为该站点提供服务,因为这个新文件将是站点可用的第一个文件文件夹。

你必须创建一个符号链接:

sudo ln -s /etc/httpd/sites-available/0a.conf /etc/httpd/sites-enabled/0a.conf

要检查服务顺序,请使用它:

sudo apachectl -S

现在,重新启动 apache,然后检查一下。

要开心=)

【讨论】:

在启用站点和可用站点之间创建/删除符号链接由从软件包安装时与 apache 一起安装的实用程序负责。 sudo a2ensite your_domain.conf 将在启用站点(从而启用虚拟主机)中创建符号链接,sudo a2dissite your_domain.conf 将删除符号链接(从而禁用虚拟主机)【参考方案5】:

必填 - 以前的答案都不适合我。在这个被ISPConfig弄乱的Apache配置中,我继承了基于IP地址的虚拟主机和基于虚拟主机(未分配/捕获所有IP地址)的虚拟主机的奇怪组合。

我希望 Apache 为未配置的主机提供相同的页面。

我有:未配置的主机转到000-default.conf 之后的第一个虚拟主机。不管我有 *:80 捕获所有定义为第一个虚拟主机,而不是默认的 Apache 将加载第一个定义的站点:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
</VirtualHost>

虽然它不是完全有效的配置,但最终起作用的是添加一个基于 IP 地址的虚拟主机,而没有定义 ServerName/ServerAlias:

<VirtualHost 192.168.10.10:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost 192.168.10.10:443>
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html
  SSLEngine On
  ...
</VirtualHost>

$ apachectl -S首先输出基于IP地址的vhosts,然后输出基于*的vhosts,最后我的默认站点在真实站点之前被加载:

AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/sites-enabled/000-default.conf:50
192.168.10.10:80        is a NameVirtualHost
         default server server.tld (/etc/apache2/sites-enabled/000-default.conf:34)
         port 80 namevhost server.tld (/etc/apache2/sites-enabled/000-default.conf:34)
         port 80 namevhost some-site.tld (/etc/apache2/sites-enabled/100-some-site.tld.vhost:7)

...

46.23.86.103:443       is a NameVirtualHost
         default server server.tld (/etc/apache2/sites-enabled/000-default.conf:38)
         port 443 namevhost server.tld (/etc/apache2/sites-enabled/000-default.conf:38)
         port 443 namevhost some-site.tld (/etc/apache2/sites-enabled/100-some-site.tld.vhost:182)

...

*:80                   is a NameVirtualHost
         default server server.tld (/etc/apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost server.tld (/etc/apache2/sites-enabled/000-default.conf:1)

注意事项 - 在这样的配置中,* vhosts 将无法工作,因此您需要将 IP 地址应用到所有 vhosts。

【讨论】:

【参考方案6】:

另一种设置是将默认虚拟主机放在配置文件的末尾而不是开头。这样,所有备用虚拟主机都会在被默认虚拟主机匹配之前进行检查。

例子:

NameVirtualHost *:80
Listen 80

...

<VirtualHost *:80>
        ServerName host1
        DocumentRoot /someDir
</VirtualHost>

<VirtualHost *:80>
        ServerName host2
        DocumentRoot /someOtherDir
</VirtualHost>

<VirtualHost *:80>
        DocumentRoot /defaultDir
</VirtualHost>

【讨论】:

根据wiki.apache.org/httpd/…。这是一种常见的错误配置,不会起作用。【参考方案7】:

我遇到了同样的问题。我可以通过在虚拟主机的 IncludeOptional 指令之前在 httpd.conf 本身中添加以下内容来修复它。现在 localhost 和 IP 192.168.x.x 都指向 Apache 的默认测试页面。所有其他虚拟主机都按预期工作。

<VirtualHost *:80>
    DocumentRoot /var/www/html
</VirtualHost>

参考:https://httpd.apache.org/docs/2.4/vhosts/name-based.html#defaultvhost

【讨论】:

【参考方案8】:

NameVirtualHost 选项将是一个不错的选择。

【讨论】:

你能举个例子吗?我已经在本文档的顶部有 NameVirtualHost * 行。如果我想要一个默认页面,我需要如何更改它? 你能扩展你的答案吗? editing your answer(没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的)。【参考方案9】:

解决办法是:

# apache2.conf

# @warning this is specific to apache 2.2
NameVirtualHost *:80
Listen 80

# ...
# aaaa.com.conf

<VirtualHost *:80>
    ServerName aaaa.com
    DocumentRoot /defaultDir
</VirtualHost>
# host1.conf

<VirtualHost *:80>
    ServerName host1
    DocumentRoot /someDir
</VirtualHost>
# host2.conf

<VirtualHost *:80>
    ServerName host2
    DocumentRoot /someOtherDir
</VirtualHost>

在我的情况下,为了工作,我创建了一个名为 CNAMEVirtualHost(每个 CNAMEVirtualHost),因为我有不同的文件用于不同的 VirtualHosts,并且知道 Apache 按字母顺序读取它们.

【讨论】:

什么是缩写。 “n.e.”? @Cocfay 而不是使用像aaaa.com.conf 这样的文件名,您应该坚持使用默认的000-default.conf,它应该是 99.99% 的 alpha 顺序中的第一个文件

以上是关于Apache 默认虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

Apache的默认虚拟主机

4.Apache和PHP结合 Apache默认虚拟主机

PHP和Apache结合 Apache默认虚拟主机

Apache 虚拟主机:HTTP 被重定向到默认的 Apache 站点

Apache和PHP结合 Apache默认虚拟主机

apache禁止访问默认虚拟主机