修改/etc/hosts文件没有任何效果。

我正在尝试通过更改/etc/hosts来阻止自己访问浪费时间的网站。例如:
127.0.0.1   localhost
127.0.1.1   ross-laptop

127.0.0.1   bing.com

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

我可以在新打开的Chrome或Firefox中访问bing.com,为什么这不起作用?
5个回答

你会发现浏览器和系统会为你缓存一些东西。为了使其立即生效,你应该确保清除缓存并重新启动浏览器。为了测试这个功能,尝试从终端执行DNS检查。
ping bing.com

你应该从 127.0.0.1 收到回复。如果这样能正常工作,那么你的 hosts 文件更改是正确的,只是在你的浏览器中被缓存了而已。

但是缓存真的能在重新启动浏览器后保留吗?我也遇到过这个问题。如果有一种方法可以使缓存失效,那就太好了。 - loevborg
1我不100%确定 DNS 缓存是否能在浏览器重新加载时保留。但我知道文件缓存是可以的。现在的 Web 开发通常采用 ajax/多请求模型,当加载页面时你不希望每个请求都进行一次 DNS 查询。每个浏览器都有自己的加速技巧,所以你需要根据每个浏览器和版本来检查它们的 DNS 缓存机制。 - Rick
如果 DNS 缓存在浏览器重新启动时不保留,我会感到惊讶,至少在大多数浏览器中是如此(可能是所有主要的浏览器)。 - David Z

你试过把 127.0.0.1 的条目放在同一行吗? 120.0.0.1 abc bing.com foo 那应该可以解决问题。

3这确实起作用了,尽管我认为这与浏览器缓存有关,而且没有正确清除缓存。 - Ross

打开终端(ALT+F2)。
在输入框中键入sudo -i。选中在终端中运行选项。最后点击运行按钮。
如果需要,输入密码并按下回车键。然后输入以下命令。
gedit /etc/hosts

你将会得到Gedit文本编辑器窗口。
例如,如果我们需要屏蔽Facebook,在127.0.0.1 localhost之后添加以下行。
0.0.0.1 facebook.com    
0.0.0.1 www.facebook.com

通过这样做,它将在包括Google Chrome、Chromium和Mozilla在内的所有浏览器中阻止该网站。
就是这样。当你现在打开www.facebook.com或facebook.com时,无法访问它。要重新启用Facebook,请从文件/etc/hosts中删除我们添加的行。
来源 - Subin's Blog

除了CragM的解决方案之外,记住你可以使用所有127.x.x.x地址来实现这个目的,不要重复使用相同的地址。
127.0.0.1   localhost
127.0.0.2   ross-laptop
127.0.0.3   bing.com
127.0.0.4   foo.com
127.0.0.5   bar.com
......

1请问您能解释一下为什么不能重复使用相同的地址吗? - 8128
@fluteflute,我不确定,但我过去常这么做,而且总是有效的。 - grokus

修改/etc/hosts看起来像是一个全局性的黑客行为。我建议你设置一个本地的HTTP代理(squid、privoxy等),然后将浏览器指向它。这样,你就能以更灵活的方式管理代理级别的黑名单。

2听起来这样做比在/etc/hosts中添加几行要费力很多,你能解释一下为什么这是一个更好的解决方案吗? - 8128
因为你没有尝试过,所以你只是在做出一些假设。执行apt-get install、编辑配置文件和/或黑名单,并将浏览器指向本地代理并不更加复杂。这样做更好,因为你不会对系统进行任何全局更改,你只是设置了一种替代的方式来阻止某些网站。如果你需要撤销,你不必再次编辑/etc/hosts,你只需将浏览器设置为直接访问网站,而不是通过代理访问。 - vh1