为什么 Chrome 会忽略 OS X 上的 /etc/hosts?

为什么 Chrome 会忽略 OS X 上的 /etc/hosts?

我正在使用 OS X 10.8.5 和 Chrome 30。

我将其添加127.0.0.1 youtube.com到我的/etc/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
::1             localhost
fe80::1%lo0     localhost

127.0.0.1       youtube.com

当我运行命令时traceroute youtube.com,我收到了预期的结果(youtube.com 解析为 127.0.0.1):

traceroute to youtube.com (127.0.0.1), 64 hops max, 52 byte packets
1  localhost (127.0.0.1)  0.272 ms  0.118 ms  0.063 ms

但是,当我在 Chrome 中输入 youtube.com 时,我的浏览器并没有与 127.0.0.1 建立连接,而是与 YouTube 的“正常”IP 地址建立连接。我原本以为 Chrome 会将 youtube.com 解析为 127.0.0.1。

我已将 Chrome 配置为使用系统的代理设置。在 OS X 中,当我转到“系统偏好设置”>“网络”>“高级...”>“代理”时,我选择了“自动代理发现”。

为什么 Chrome 似乎忽略了我的/etc/hosts文件?

答案1

尝试将其添加www.youtube.com到您的 hosts 文件中。youtube.com永久重定向到www.youtube.com,因此只要您访问过youtube.com一次,您的浏览器就会缓存此响应并将您重定向到www.youtube.com。 此地址不在您的 hosts 文件中,因此 chrome 从逻辑上可以正确解析它。

答案2

Google Chrome 会忽略您的 hosts 文件并执行实际的 DNS 查找(尽管其他人可能认为它/etc/hosts不是 DNS 的一部分,但它是事先的DNS)。而 Google Chrome应该它会尊重那些它不遵守的 hosts 文件条目。hosts 文件是一个选择到 DNS,当没有可用的 DNS 服务器时将被读取(例如,如果您禁用了网络连接)。

您可以通过将“127.0.0.1 foobar.dev”添加到您的主机文件,然后启用 wireshark 并在您的网络接口上进行观察来测试这一点。打开 Chrome 并http://foobar.dev/在地址栏中输入并运行。您将在 Wireshark 中看到一个 DNS 查询,如下所示:

2   1.668727000 192.168.32.104  8.8.8.8 DNS 75  Standard query 0x663a  A foobar.dev

值得一提的是,Google DNS 为 foobar.dev 返回 127.0.53.53。

3   1.706484000 8.8.8.8 192.168.32.104  DNS 91  Standard query response 0x663a  A 127.0.53.53

解决方法是使用主机管理这是一个较旧的 Chrome 扩展程序,可让 Chrome 使用主机。但是,较新版本的 Chrome(显然大于 38)不再支持它。

答案3

我通过以下方式修复了这个问题: 在 Chrome 的高级偏好设置中关闭“保护您和您的设备免受危险网站的侵害”。

Chrome 的内置“保护”包括直接根据自己的 DNS 检查域,并绕过它认为“可疑”的某些类型的主机条目或被覆盖的现有站点条目,这意味着大多数自定义主机条目都会被忽略。尤其是用于开发的 *.dev 和 *.local 条目。

对我来说,关闭这个功能 100% 解决了这个问题。在进行本地开发时,这个问题让我抓狂了好几个月,我找不到任何答案,每个人都说这不可能。原来,这是在高级设置中简单的切换。希望这对你也有帮助,加油。

答案4

Localhost 是 127.0.0.1 地址的约定,该地址是 tcp/ip 的内部地址,但是,Chrome 不使用 /etc/hosts 来解析地址,而是使用 DNS 服务器,因此任何地址都不是来自您的 /etc/hosts,而是来自 DNS 服务器,如果它使用 /etc/hosts,它将必须保存整个 www 主机名才能解析任何地址。

希望这可以帮助。

相关内容