【问题标题】:VirtualHost always returns default host with Apache on Ubuntu 14.04VirtualHost 始终在 Ubuntu 14.04 上使用 Apache 返回默认主机
【发布时间】:2014-07-05 22:56:59
【问题描述】:

我尝试在默认的localhost 之外设置一个虚拟主机。 每当我尝试调用我的虚拟主机http://test 时,我都会得到位于http://localhost 目录中的默认Apache2 索引文件。此外,在禁用 (a2dissite) 两个 VirtualHost 文件和重新加载 apache (service apache2 reload) 后,apache 仍会返回此页面。

虚拟主机不工作会出什么问题?

配置:

我的目录结构如下:

/var/www/html                  # Default localhost dir
/var/www/html7index.html       # Apache2 default index

/var/www/test                  # HTML dir for the virtual host
/var/www/test/index.html       # My "website" 

/etc/hosts的内容:

127.0.0.1       localhost
127.0.1.1       Laptop
127.0.0.1       test

/etc/apache2/sites-available的目录内容:

000-default.conf
default-ssl.conf
test.conf

文件000-default.conf

<VirtualHost localhost:80>
        ServerName localhost
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

文件test.conf

<VirtualHost test:80>
        ServerAdmin test@localhost
        ServerName test
        NameVirtualHost test
        ServerAlias test
        DocumentRoot /var/www/test
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

【问题讨论】:

  • 所以你已经做了a2ensite test
  • 是的,当然。抱歉,忘记了。
  • 您的 vHost 文件和主机文件对我来说看起来不错。您在进行 a2ensite test 时是否获得了 apache 默认页面?你能从日志中找到任何东西吗?
  • 日志中没有任何内容。但我想通了。看我自己的答案。谢谢。

标签: apache ubuntu virtualhost


【解决方案1】:

我遇到了这个问题,结果我不得不禁用默认虚拟主机。

sudo a2dissite 000-default.conf

可能的扩展:

根据apache文档An In-Depth Discussion of Virtual Host Matching

[...] 如果此时主服务器没有 ServerName,则使用运行 httpd 的机器的主机名。

这意味着如果默认 vhost(通常为 000-default.conf)没有设置 ServerName - 这是默认设置 - Apache 将回退到操作系统的主机名。

因此,Apache 会从默认虚拟主机 (000-default.conf) 中选择并提供服务,即使配置了另一个用户创建的虚拟主机,其服务器名称与机器的主机名相同。

原因是 Apache 按文件名的字母顺序对虚拟主机进行排序,并选择与请求的 HTTP 主机标头匹配的第一个虚拟主机配置。因此,在用户定义的虚拟主机之前检查 000-default.conf,因为它们通常不以 000- 为前缀。

【讨论】:

  • 这对我有用。但我讨厌没有解释的解决方案。为什么 Apache 不跟随我的虚拟主机而是加载默认的虚拟主机?完全没有意义。
  • 这是正确的解决方案。请添加一些有关它的详细信息。
  • 通常 Ubuntu 上的 apache2 为默认站点设置了虚拟主机,即当 apache 找不到附加到另一个虚拟主机的更具体的域 (TLD) 时。命令a2dissite SITE_NAME 是一个用于在 Ubuntu/Debian 系统上禁用任何已启用站点的脚本。相反的命令是a2ensite,用于启用禁用的站点。这些命令只能以特权权限执行,即sudo。它也适用于 Ubuntu 当前的 16.04LTS 和 17.04。
  • 为我工作。我认为 中该死的 * 是问题所在......
  • 不。我有相反的问题。我有 并且它仍在处理 e.conf 。这是有道理的,因为 e.conf 首先是按字母顺序排列的,但让我感到困惑的是,在我安装letsencrypt serverfault.com/questions/1013270/… 之前,它并没有阻止 ssl.conf 先被处理
【解决方案2】:

tl;dr:sudo 调用它:sudo service apache2 reload


看起来service apache2 reload 的行为愚弄了我。请参阅以下日志:

user@Laptop:/etc/apache2/sites-available$ sudo a2ensite test.conf 
Enabling site test.
To activate the new configuration, you need to run:
  service apache2 reload
user@Laptop:/etc/apache2/sites-available$ service apache2 reload
 * Reloading web server apache2                                                  * 
user@Laptop:/etc/apache2/sites-available$

尝试联系http://test不工作

user@Laptop:/etc/apache2/sites-available$ sudo service apache2 reload
 * Reloading web server apache2                                                  * 
user@Laptop:/etc/apache2/sites-available$

尝试联系http://testWORKING

所以,找出差异!关键是我认为它首先会正确重新加载。日志文件中也没有条目。使用 sudo 调用它会有所帮助。这是一个错误吗?

【讨论】:

  • 没有 sudo,apache 不会抛出异常。所以你不知道你是否正确地重新加载了你的conf。谢谢。
  • 清除浏览器缓存。我被发送到我的默认站点,该站点通过那里的 .htaccess 重定向了我。这意味着,即使我确实使用了 sudo,我的浏览器仍然决定重定向我。清除缓存修复它。
  • 谢谢你,第二次没有抛出错误(!)
【解决方案3】:

只是指出这一点对于有经验的用户来说可能是显而易见的,但如果你是第一个计时器,那就不是那么明显了。

确保您在/sites-enabled 中使用的配置以.conf 结尾,正如您的apache2.conf 中所预期的那样

这是我的问题,它解决了。

【讨论】:

  • 不知道我查看了我的代码有多久,并没有注意到我命名良好的文件是域,而不是 domain.conf。谢谢指出
【解决方案4】:

如果您已经尝试过以下方法:
1.检查文档根目录和父文件夹的权限。
2. a2dissite 000-default 等
3. 使用 sudo service apache2 reload 重启 apache
它仍然无法正常工作,然后执行以下操作:

1.启用调试日志记录:
vi /etc/apache2/apache2.conf
LogLevel debug

2.重启apache2并监控日志
sudo service apache2 restart
tail -f /var/log/apache2/*.log

3.注意服务器的 IP 是否按预期显示在日志中:

==> /var/log/apache2/other_vhosts_access.log

您会注意到它不像典型的 IP 地址那样 xxx.xx.xx.xx:80
我有一些 FQDN,例如“ip-xxx-xx-xx-xx.eu-west-2.compute.internal:80”
我正在使用 AWS 弹性 IP 为我的 Amazon EC2 Web 服务器创建一个固定 IP。

4.检查您的虚拟主机 .conf 文件的头部

<VirtualHost 127.0.0.1:80 11.22.33.44:80>
# Added from nessus to make more secure
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
ServerName mydomain.com
...

好的,所以我们在这里看到的是,我们告诉 Apache 为来自 127.0.0.1 或 11.22.33.44 端口 80 上的请求提供服务。但是服务器永远不会看到这些 IP,因为它得到了那个奇怪的 FQDN,所以它永远不会火柴!尤里卡!

解决方案:
将 *:80 添加到 VirtualHost 标记,使其如下所示:

<VirtualHost 127.0.0.1:80 11.22.33.44:80 *:80>


并重新启动 apache。我希望这有帮助。可能还有其他原因,但如果这是您的问题的原因,那么是时候坐下来,喝杯茶放松一下了!如果没有,那么我希望您能找到解决方案。

PS。记得把你的日志放回去警告而不是调试!

【讨论】:

  • 使用 &lt;VirtualHost mysite.com:80 *:80&gt; 并重新加载 Apache 就像一个魅力。谢谢楼主!
  • 如果你输入*:80,其他的都是多余的。 &lt;VirtualHost *:80&gt; 就足够了。
  • 对我来说,问题出在 VirtualHost 标头上,像您指出的那样修复了它,现在就像一个魅力。谢谢。
【解决方案5】:

我浏览了所有这些解决方案,但都没有奏效。然后,我决定回去检查 apache2.conf 文件。我发现默认情况下,包含“启用站点”的 conf 文件的行被注释掉了。通过取消注释该行并重新启动 apache,它解决了我的问题(它接近文件末尾):

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf 

【讨论】:

    【解决方案6】:

    可能虚拟主机的 .conf 文件有问题。

    首先运行命令:

    apache2ctl -S
    

    响应必须类似于

    VirtualHost configuration:
    *:443                  is a NameVirtualHost
         default server localhost (/etc/apache2/sites-enabled/default-ssl.conf:2)
         port 443 namevhost localhost (/etc/apache2/sites-enabled/default-ssl.conf:2)
         port 443 namevhost myvhost.com (/etc/apache2/sites-enabled/myvhosts.com.conf:20)
                 alias www.myvhost.com
    
    *:80                   is a NameVirtualHost
         default server localhost (/etc/apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost localhost (/etc/apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost myvhost.com (/etc/apache2/sites-enabled/myvhost.com.conf:1)
                 alias www.myvhost.com
    

    但有时你可以阅读:

    default server myvhost.com (/etc/apache2/sites-enabled/default-ssl.conf:2)
    

    因此您的虚拟主机域指向默认配置(http 或 https)。

    解决方案是在default-ssl.conf000-default.conf 文件中添加ServerName localhost 指令。

    Apache 不知道您的默认站点的名称是谁,它需要随机解析 127.0.0.1。

    设置ServerName后,必须运行:

    service apache2 reload
    service apache2 restart
    

    如果您再次运行apache2ctl -S,您必须看到默认服务器的正确匹配。

    【讨论】:

      【解决方案7】:

      它也让我发疯了,我一遍又一遍地检查我的 .conf 文件,所有的定义都绝对正确。我最终在这篇文章中尝试了 a2ensite 和 a2dissite 命令作为 sudoer,重新启动 apache,仍然登陆默认的 apache 欢迎页面,就好像 apache 永远不会禁用默认站点或使用我的新虚拟主机一样。

      原来我试图在不使用 sudo 的情况下重新启动 apache...

      service apache2 restart
      

      使用

      sudo service apache2 restart
      

      【讨论】:

        【解决方案8】:

        如果你保持默认 *:80; *.443 确保它在底部 - 所以将 000-default 重命名为 zzz-default

        【讨论】:

          【解决方案9】:

          我看到在 /etc/hosts 文件中使用与我尝试连接的站点相同的完全限定域名 (FQDN) 时会发生这种情况。为了解决这个问题,我不得不将 FQDN 重命名为不同于我的 VirtualHost ServerName 值之一。

          也就是说,如果我的 /etc/hostname 是:

          apple
          

          在我的 /etc/hosts 中,我有:

          192.168.54.34 apple.example.com apple
          

          在我的 /etc/apache2/sites-enabled/apple.example.com.conf 我有:

          <VirtualHost *:80>
              ServerAdmin blah@apple.example.com
              ServerName apple.example.com
              DocumentRoot /var/www/apple.example.com
              DirectoryIndex index.html index.php
          </VirtualHost>
          

          apple.example.com 将被 000-default.conf 接受,因为它也在 /etc/hosts 文件中列出。为了解决这个问题,我只是在 /etc/hostname 文件中更改了我的服务器的 FQDN,如下所示:

          server1
          

          和 /etc/hosts 文件:

          192.168.54.34 server1.example.com server1
          

          【讨论】:

            【解决方案10】:

            这不止一次地咬了我;有时我会启用 sudo - 有时我不会。

            Ubuntu 14.04 似乎以任何方式显示相同的消息。当以每小时 100 英里的速度行驶时,有时您会错过一两个sudo

            新网站默认返回错误目录的症状是我唯一的线索,即启用从未发生过。我会说这是一个错误。

            它至少应该在命令未执行时发出警告!!!

            【讨论】:

            • 顺便说一句——同样的“错误”发生在 a2dissite 上——Ubuntu 显示它删除了符号链接——但实际上并没有。
            【解决方案11】:

            对我来说,它在重新启动 apache 后开始工作:sudo service apache2 reload。然后在 http://test 上按 ctrl + F5。

            【讨论】:

              【解决方案12】:

              我在 Apache 2.4 上的情况是通过在虚拟主机配置中添加以下设置来解决的:

              Listen 80
              

              所以设置类似于:

              Listen 80
              <VirtualHost *:80>
                  ServerAdmin admin@example.com
                  ServerName testsite.com
                  ServerAlias www.testsite.com
                  DocumentRoot /var/www/testsite
                  ErrorLog ${APACHE_LOG_DIR}/error.log
                  CustomLog ${APACHE_LOG_DIR}/access.log combined
              </VirtualHost>
              

              【讨论】:

                猜你喜欢
                • 2016-06-19
                • 1970-01-01
                • 2016-02-12
                • 1970-01-01
                • 1970-01-01
                • 2019-07-28
                • 1970-01-01
                • 2017-09-14
                • 2011-11-23
                相关资源
                最近更新 更多