为啥在 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 配置中,输入您要启用的特定本地站点名称,而不是使用通配符:
<VirtualHost site1.dev:80>
而不是 <VirtualHost *:80>
关闭 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 也不起作用?