主机文件被忽略,如何排除故障?

Sup*_*est 183 windows hosts

Windows 计算机上的主机文件用于将某些名称字符串绑定到特定 IP 地址以覆盖其他名称解析方法。

通常,人们决定更改主机文件,并发现更改拒绝生效,或者此后甚至忽略主机文件的旧条目。许多“陷阱”错误都可能导致这种情况,要弄清楚是哪个错误可能会令人沮丧。

当面对Windows忽略hosts文件的问题时,可能遵循的综合故障排除协议是什么?


这个问题在 SO 上有重复,例如HOSTS 文件被忽略

但是,这些往往是针对特定情况的,一旦发现 OP 犯的任何错误,讨论就结束了。如果你没有碰巧犯过同样的错误,这样的讨论就不是很有用了。因此,我认为拥有一个通用协议来解决所有与主机相关的问题并涵盖所有情况会更有帮助。

Sup*_*est 264

根据我自己的经验和我在谷歌搜索时遇到的情况,这里有一些可以尝试的事情:

1. 你检查它是否正常工作?

对主机的更改应立即生效,但 Windows 会缓存名称解析数据,因此可能会在一段时间内使用旧记录。打开命令行(Windows+R, cmd, Enter)并输入:

ipconfig /flushdns
Run Code Online (Sandbox Code Playgroud)

删除旧数据。要检查它是否有效,请使用(假设您的主机中有www.example.com的 ipv4 条目,或 ipv6.example.com 的主机中有 ipv6 条目):

ping www.example.com -n 1
ping -6 ipv6.example.com -n 1
Run Code Online (Sandbox Code Playgroud)

并查看它是否使用了正确的 IP。如果是,则您的主机文件没问题,问题出在其他地方。

此外,您可以使用以下命令重置 NetBios 缓存(以管理员身份打开控制台,否则它将失败):

nbtstat -R
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令检查 DNS 缓存中的当前数据:

ipconfig /displaydns | more
Run Code Online (Sandbox Code Playgroud)

注意:nslookup不查看主机文件。见NSLOOKUP 和 NBLOOKUP 给出一个 IP 地址;PING 找到另一个

2. 基础知识

  • 您的主机文件是否正确命名?应该是hosts,不是host,等等。
  • 扩展名是否正确?它应该没有扩展名(hosts不是hosts.txt) - 如果您将窗口配置为隐藏已知扩展名,请小心,检查属性以确保:正确的主机文件类型将仅显示为“文件”。
  • 您是否遵循了正确的语法?您是否不小心在行前添加了#表示注释的哈希 ( )?
  • 您是否处理了所有变体(www.example.com并且example.com- 最安全的是将两者都添加)?

3. 空白

每行的格式是IP address,然后是水平制表符(转义码\t、ASCII HT、十六进制0x09)或单个空格(十六进制0x20),然后是主机名,即。www.example.com,然后最后一个回车,然后是换行,(转义码\r\n,ASCII CRLF,十六进制0x0d 0x0a)。

示例条目,使用 Unicode 控制图片来表示控制字符。(不要将这些复制并粘贴到您的主机文件中!)

192.0.2.1?www.example.com??
2001:db8:8:4::2?ipv6.example.com??
Run Code Online (Sandbox Code Playgroud)

可以在Notepad++ 中使用十六进制编辑器插件查看单个字节。Notepad++ 还将显示特殊字符(查看 -> 显示符号),因此您可以轻松检查空白字符的数量和种类。

如果您从某处复制并粘贴了主机条目,则最终可能会出现多个空格。理论上,hosts 支持分隔两列的多个空格,但是如果没有其他方法可以尝试,那就是另一回事了。

为了安全起见,请确保主机文件中的所有行都使用制表符或空格,而不是两者都使用。

最后,用空行终止文件。

4. 注册表项

有一个注册表项指定主机文件的位置。据说,Windows 实际上并不支持将主机文件放在其他位置,但您可能需要检查一下。关键是:

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DataBasePath
Run Code Online (Sandbox Code Playgroud)

条目应该是:

%SystemRoot%\System32\drivers\etc
Run Code Online (Sandbox Code Playgroud)

5. 权限

有时文件的权限、文件属性和类似的东西会出现问题。要使用默认权限重新创建文件:

  1. 在桌面上创建一个新的文本文件。
  2. 将当前主机文件的内容复制并粘贴到记事本中的此文件中。
  3. 保存新的文本文件并将其重命名为hosts.
  4. 将文件复制(不要移动)到您的%SystemRoot%\System32\drivers\etc目录,并覆盖旧文件。

最后一点很重要:复制有效,移动无效。

本地Users帐户必须能够读取主机文件。确保(在 Windows 7 中):

  1. %SystemRoot%\System32\drivers\etc在 Windows 资源管理器中导航到。
  2. 如果您看不到该hosts文件,请确保您可以看到隐藏文件和系统文件
  3. 右键单击该hosts文件并Properties从上下文菜单中选择。
  4. hosts Properties窗口中,单击Security选项卡。
  5. 检查框中的名称列表Group or user names:。如果%COMPUTERNAME%\Users存在,请单击它以查看权限。
  6. 如果Users不存在,或者存在但没有Read权限,请单击Edit...
  7. 如果Users不存在,请单击Add...,键入Users,单击Check Names,然后单击确定或按 Enter。
  8. 选择Users,并确保Read & executeAllow列中选中。单击确定。如果Windows Security弹出警告框,请选择Yes继续。
  9. 单击确定关闭hosts Properties窗口。
  10. 转到此答案的第 1 部分并按照说明检查它现在是否有效。

6. 编码

主机文件应以 ANSI 或 UTF-8 编码,不带 BOM。您可以使用文件 -> 另存为来执行此操作。

7. 代理

如果您配置了代理,它可能会绕过主机文件。解决方案是不使用代理,或将其配置为不执行此操作。

要检查,请转到 Internet Explorer -> Internet 选项 -> 连接 -> LAN 设置。如果一切都为空并且“自动检测设置”被选中,则您没有使用代理。

如果您依靠代理访问 Web 并且因此不想禁用它,您可以通过转至 Internet Explorer -> Internet 选项 -> 连接 -> LAN 设置 -> 代理服务器/高级来添加例外。然后将您的例外添加到例外文本框中。例如localhost;127.0.0.1;*.dev

8. DNS 地址

(这也可以解决代理问题。)

转到您的网络连接属性,然后是 TCP/IP 设置,并将第一个 DNS 服务器更改为127.0.0.1(localhost)。第二个应该是您实际的 DNS 的 IP。

这对于主机文件的工作来说不是必需的,但如果某些东西配置很奇怪,它可能对您有所帮助。

9.本地地址

如果您使用 myhost.local 形式的 .local 域条目并且它被忽略,请尝试以下操作:

x.x.x.x myhost.local www.myhost.local
Run Code Online (Sandbox Code Playgroud)

即使www.myhost.local不存在。Windows 以某种方式不附加其工作组或本地域。

10.行/计数限制

(添加到此答案中以使其可见,因为它已被多次提及)

Windows 主机文件似乎有行或主机限制。如果一行中有 150 个以上的字符或一个 IP 的主机条目超过 8 个,则创建一个新行

例如,而不是:

1.2.3.4 host1.com host2.com host3.com host4.com host5.com host6.com host7.com host8.com host9.com 
Run Code Online (Sandbox Code Playgroud)

尝试这个:

1.2.3.4 host1.com host2.com host3.com host4.com host5.com
1.2.3.4 host6.com host7.com host8.com host9.com
 
Run Code Online (Sandbox Code Playgroud)

  • 好帖子,但有几个错误。1) IE 中的“自动检测设置”* 可以* 引导您(甚至在不知不觉中)使用代理,如果您的网络确实提供代理自动配置。2) 在网络设置中更改 DNS 服务器与如何/何时/是否使用 `hosts` 文件无关,将其更改为 127.0.0.1 实际上是一个错误,除非您实际上正在运行 DNS您计算机上的服务器。 (4认同)
  • 非常感谢你!我几乎要哭了,在 2 行之间的空白条目开始时,我们的很多人都为空格而疯狂。谢谢谢谢谢谢谢谢谢谢!!!!! (3认同)
  • 您可以补充说,有行长度限制。我不确定限制是多少,但我的行长度为 275 个字符(16 个主机名)并且最后几个主机名未注册。当我将它们分成两行时,它们都正确注册。 (3认同)

小智 18

确保您先输入 ipaddress,然后再输入“域”,如下所示:

127.0.0.1   bo.dev
127.0.0.1   www.bo.dev
Run Code Online (Sandbox Code Playgroud)

  • 小心,windows 主机文件每行只允许九个或更少的条目!这让我很困惑,花了一段时间才弄明白。 (9认同)
  • 我更喜欢使用一行:`127.0.0.1 bo.dev www.bo.dev ftp.bo.dev` (8认同)
  • 不要在本地使用 `.dev` TLD 认为你不会发生冲突。它是 Google 拥有的有效通用全球 TLD,使用它会遇到很多问题。见 https://ma.ttias.be/chrome-force-dev-domains-https-via-preloaded-hsts/ (4认同)

小智 13

请添加检查文件权限。我发现即使我对计算机和主机具有本地管理员权限。直到我使用 Read 和 Read & Execute 将本地用户添加到主机文件权限,然后 ipconfig /flushdns 主机才变为活动状态。

  • 就是这样!这个问题让我困惑了_年_。我添加了具有 **Read** 和 **Read & execute** 权限的 `(machine)\USERS`,并且在 `ipconfig /flushdns` 之后它起作用了。非常感谢。我很高兴终于可以找回我的主机文件。 (3认同)

小智 10

在我的情况下,我尝试了 Windows 7 创建的文件:C:\Windows\System32\drivers\etc\hosts.ics。

主机.ics:

# This file has been automatically generated for use by Microsoft Internet
# Connection Sharing. It contains the mappings of IP addresses to host names
# for the home network. Please do not make changes to the HOSTS.ICS file.
# Any changes may result in a loss of connectivity between machines on the
# local network.
Run Code Online (Sandbox Code Playgroud)

因此,Windows 会忽略 C:\Windows\System32\drivers\etc\hosts 中的设置并使用 hosts.ics 中的设置。

  • 来自 https://support.microsoft.com/en-us/kb/309642/en-us,这是旧的,所以可能不再准确:*“ICS 使用 Hosts.ics 文件来存储有关动态配置客户端的信息. 避免对此文件进行更改以防止丢失连接或数据。Hosts 文件(没有文件扩展名)是您向其中添加有关静态配置客户端的信息的文件。”* 因此,我不希望 Windows忽略 `Hosts` 文件只是因为 `Hosts.ics` 存在。其他原因可能会导致 Windows 忽略您的主机文件,例如可能是错误(但隐藏)的扩展名。 (2认同)