【问题标题】:Apache default VirtualHostApache 默认虚拟主机
【发布时间】: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 文件中的域使用不同的根。这可能吗?

【问题讨论】:

    标签: apache virtualhost


    【解决方案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>
        

        【讨论】:

        【解决方案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 顺序中的第一个文件
          猜你喜欢
          • 2016-04-29
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 2018-03-23
          • 2017-01-26
          • 1970-01-01
          • 2018-02-18
          • 2013-03-24
          相关资源
          最近更新 更多