为啥在 Apache 中设置虚拟主机后,http://localhost 会重定向到我的默认虚拟主机?

Posted

技术标签:

【中文标题】为啥在 Apache 中设置虚拟主机后,http://localhost 会重定向到我的默认虚拟主机?【英文标题】:Why does http://localhost redirect to my default virtual host once I setup virtual hosts in Apache?为什么在 Apache 中设置虚拟主机后,http://localhost 会重定向到我的默认虚拟主机? 【发布时间】:2010-10-06 07:47:31 【问题描述】:

这可能是一个简单的问题,但我想更好地了解 Apache 如何与虚拟主机一起工作。我正在设置虚拟主机,因为我同时在多个网站上工作并且我不想使用子目录。我几乎使用了默认的 Apache httpd.conf 文件,其中 DocumentRoot 指向类似“/www”的东西。我取消了虚拟主机的注释并添加了以下内容:

名称虚拟主机 *:80 服务器名称 site1.dev DocumentRoot /www/site1 虚拟主机> 服务器名称 site2.dev DocumentRoot /www/site2 虚拟主机>

现在,当我转到 http://localhost 时,我得到了 site1 的默认页面。

我确信这是有道理的,但我不太明白。我会认为只有明确发送到http://site1.test 的请求才会通过该指令进行路由,并且它不会成为默认值。有人可以解释为什么它成为默认值。

【问题讨论】:

+1 因为我一直忘记这个 【参考方案1】:

http://httpd.apache.org/docs/1.3/vhosts/name-based.html

(对于 2.x 也应该如此)

"如果没有找到匹配的虚拟主机,那么将使用第一个列出的与 IP 地址匹配的虚拟主机。

因此,第一个列出的虚拟主机是默认虚拟主机。当 IP 地址与 NameVirtualHost 指令匹配时,将永远不会使用来自主服务器的 DocumentRoot。如果您想对与任何特定虚拟主机不匹配的请求进行特殊配置,只需将该配置放入容器中,然后将其首先列在配置文件中。”

【讨论】:

我可以确认 Apache 2.x 也是如此。【参考方案2】:

答案 1 是正确的 我会添加 namevirtualhosts 作为第一个条目 基本上匹配任何未命名的其他虚拟主机

它只能用于捕获无意的格式错误和中断的流量

即具有一个名为 john.domain.com 的机器运行 www.domain.com 和 www.domain2.com 作为 IP www.xxx.yyy.zzz 上的有效网络服务器可能具有像这样的最佳配置

    <VirtualHost *:80>
     DocumentRoot /var/webserver/static-sites/unknown/
    # a directory readable by apache with only a robots.txt denying everything
     ServerName bogus
     ErrorDocument 404 "/errordocuments/unknown-name.html"
    #custom 404 describing how/what they might have done wrong try pointing a browser with a hosts file at http://bogus/ on 193.120.238.109 to see mine#
     ErrorLog /var/log/httpd/unknown-error.log
     CustomLog /var/log/httpd/unknown-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     DocumentRoot /var/webserver/static-sites/unknown/
    # a possibly different directory readable by apache with only a robots.txt denying everything
     ServerName www.xxx.yyy.zzz
     ServerAlias john.domain.com
     ErrorDocument 404 "/errordocuments/ip-name.html"
     ErrorDocument 403 "/errordocuments/ip-name.html"
    #custom 404 telling them as a likely hacker/bot you wish to have nothing to do with them see mine at http://193.120.238.109/
     ErrorLog /var/log/httpd/ip-error.log
     CustomLog /var/log/httpd/ip-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     ServerName domain.com
     RedirectPermanent / http://www.domain.com/
     ErrorLog logs/www.domain.com-error.log
     CustomLog logs/www.domain.com-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     DocumentRoot /var/webserver/ftpusers/domain
     ServerName www.domain.com
     ServerPath /domain
     ErrorLog logs/www.domain.com-error.log
     CustomLog logs/www.domain.com-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     ServerName domain2.com
     RedirectPermanent / http://www.domain2.com/
     ErrorLog logs/www.domain2.com-error.log
     CustomLog logs/www.domain2.com-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     DocumentRoot /var/webserver/ftpusers/domain2
     ServerName www.domain2.com
     ServerPath /domain2
     ErrorLog logs/www.domain2.com-error.log
     CustomLog logs/www.domain2.com-access.log combined
    </VirtualHost>

【讨论】:

【参考方案3】:

一种方法是:

    在您的 VirtualHosts 配置中,输入您要启用的特定本地站点名称,而不是使用通配符: &lt;VirtualHost site1.dev:80&gt; 而不是 &lt;VirtualHost *:80&gt;

    关闭 NameVirtualHost *:80 可以通过在 vhosts.conf 文件中将其注释掉来完成

    在您的 /etc/hosts 文件中提及环回 IP 的两个别名: 127.0.0.1 localhost site1.dev

就是这样。您应该会看到 localhost 像往常一样转到默认 DocumentRoot,而 site1.dev 转到您设置为虚拟主机的站点。

【讨论】:

【参考方案4】:

确认对于 Apache 2.x,如果找不到匹配的虚拟主机,将使用第一个虚拟主机(具有相同的端口号)。

http://httpd.apache.org/docs/2.2/vhosts/details.html

“如果找不到匹配的虚拟主机,则请求从第一个虚拟主机提供,该虚拟主机具有匹配的端口号,该端口号位于客户端连接的 IP 列表中”

您可以随时在下方添加此代码,将其放在NameVirtualHost *:80 的正下方,以便在未找到其他虚拟主机时默认提供您的默认文档根目录。

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /my/default/document/root
</VirtualHost>

【讨论】:

【参考方案5】:

只需将此代码放在 httpd-vhosts.conf 的顶部

<VirtualHost localhost:80>
    ServerName localhost
    DocumentRoot d:/xampp/htdocs
    <Directory  "d:/xampp/htdocs/">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require local
    </Directory>
</VirtualHost>

【讨论】:

以上是关于为啥在 Apache 中设置虚拟主机后,http://localhost 会重定向到我的默认虚拟主机?的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu #Apache2 Ubuntu 14.04 LTS系统中设置Apache虚拟主机

为啥当我在浏览器中设置代理时查尔斯没有捕获流量

为啥即使在 WKWebView 中设置 cookie 后 SSO 也不起作用?

如何在 Apache JClouds 中设置 HTTP 标头?

为啥在css中设置了宽高缩小图片后,图片变得模糊

在灯中设置虚拟主机