Chrome忽略hosts文件中本地主机的子域名

9
当我尝试访问http://mysubdomain.localhost时,Chrome会解析为[::1]80,即使hosts文件中已经有了该域名的明确条目。其他浏览器都不会这样做。Firefox、Safari和Curl都会解析hosts文件中给出的IP地址。当前hosts文件的全部内容如下:
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
192.168.88.88  mysubdomain.localhost

当我尝试在Chrome中访问http://mysubdomain.localhost时,它并没有解析到192.168.88.88。这对我来说是有问题的,因为192.168.88.88是运行在我的计算机上的虚拟机。我可以将域更改为http://mysubdomain.localhttp://mysubdomain.dev,但这需要我更新一个由项目中许多人使用的配置文件,我宁愿避免这样做,因为我可能会破坏他们的工作流程。
火狐浏览器(按预期工作)

enter image description here

curl(按预期工作)

enter image description here

Chrome(未按预期工作)

enter image description here

我已经尝试过的一些方法:

  • 我没有使用代理
  • 我已经多次清除浏览器缓存
  • 我已经从 chrome://net-internals/#dns 清除了 DNS 缓存
  • 我已经多次重启了机器
  • 我已经使用终端命令 sudo dscacheutil -flushcache;sudo killall -HUP mDNSResponder 清除了系统 DNS 缓存
  • 我已经尝试过无痕模式
  • 我已经尝试创建了一个新的 Chrome 用户账户

系统信息:
Chrome 版本:53.0.2785.116
操作系统版本:Mac OS 10.11.6(El Capitan)

2个回答

18
经过进一步审查,我认为这是符合设计的,详见Chromium问题队列:https://bugs.chromium.org/p/chromium/issues/detail?id=489973。这是出于安全方面的考虑,因为OS X的解析器无法正确确保不在网络上查询.localhost域名,而这是确保.localhost实际上是本地域名的关键安全属性。因为我们不能信任解析器做安全的事情,所以即使它可能是安全的,我们也不能信任解析器......安全风险不在于正确配置的服务器与未正确配置的服务器之间。而是DNS解析器永远不应该将foo.localhost请求发送到网络中。如果这样做,网络攻击者可以使“foo.localhost”指向他们选择的任何IP。这很糟糕,因为“localhost”(和“*.localhost”)具有特殊权限(参见http://www.w3.org/TR/ powerful-features/#is-origin-trustworthy),因为它们拥有这些特殊权限,所以它们需要是安全的。事实上,似乎Chrome可能是唯一正确实现RFC-6761的工具,该规范部分地指出:名称解析API和库应将localhost名称视为特殊名称,并始终返回环回地址的IP地址查询和负响应对于所有其他查询类型。名称解析API不应将针对localhost名称的查询发送到其配置的缓存DNS服务器。因此,似乎没有办法修复这个问题。我将更改我的虚拟机域名为http://mysubdomain.local

2
不要忘记,Mac OS X上的Bonjour使用.local顶级域名。我建议不要使用该顶级域名。而.dev已被Google购买,并似乎已向ICANN申请。多年来,我一直在说我们需要为本地开发设立专用顶级域名。这真是可悲。 - Jacob Thomason
@JacobThomason,我认为在主机文件中使用顶级域名并将其用于本地机器之外没有问题。有时我甚至会在我的主机文件中添加条目,例如127.0.0.1 mydevsite.com。我想可能存在与“真实”网站的域名冲突的假设风险,但通过选择新颖的名称可以轻松解决这个问题。 - Matt Korostoff
好的,至少对于.dev域名来说,你不能使用http,但对于开发来说这是完全正常和合理的。以下是一篇关于此主题的进一步阅读文章:https://medium.engineering/use-a-dev-domain-not-anymore-95219778e6fd - Jacob Thomason

1

玩了一会儿后,我使用火狐浏览器偶然发现了一个解决方法。您不必更改开发环境,只需安装https://www.telerik.com/download/fiddler即可。

Fiddler绕过了Chrome的DNS,因此您可以拥有完美运行的系统,而无需更改所有环境。

我已在Windows 10上使用Hyper-v和vagrant进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接