我正在使用 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 主机名才能解析任何地址。
希望这可以帮助。