Windows 计算机上的 hosts 文件用于将某些名称字符串绑定到特定 IP 地址,以覆盖其他名称解析方法。
通常,有人决定更改 hosts 文件,但发现更改无法生效,或者甚至 hosts 文件中的旧条目随后也被忽略。许多“陷阱”错误都可能导致这种情况,而找出哪个错误可能令人沮丧。
当面临 Windows 忽略 hosts 文件的问题时,可以遵循的全面故障排除协议是什么?
这个问题在 SO 上有重复,例如HOSTS 文件被忽略
然而,这些往往只针对特定情况,一旦原帖者犯的错误被发现,讨论就结束了。如果你没有犯过同样的错误,这样的讨论就没什么用了。所以我认为,制定一个解决所有主机相关问题的通用协议会更有帮助,该协议将涵盖全部案件。
答案1
根据我自己的经验以及我在 Google 上搜索时遇到的情况,可以尝试以下方法:
1. 你检查过它是否正常工作吗?
对主机的更改应立即生效,但 Windows 会缓存名称解析数据,因此一段时间内可能会使用旧记录。打开命令行 (Windows+R, cmd
, Enter) 并输入:
ipconfig /flushdns
删除旧数据。要检查它是否有效,请使用(假设您的主机中有 ipv4 条目www.example.com或者在主机中添加 ipv6.example.com 的 ipv6 条目):
ping -4 www.example.com -n 1
ping -6 www.example.com -n 1
看看它是否使用了正确的 IP。如果是,则您的 hosts 文件没有问题,问题出在其他地方。
另外,您可以使用以下命令重置 NetBios 缓存(以管理员身份打开控制台,否则将失败):
nbtstat -R
您可以使用以下命令检查 DNS 缓存中的当前数据:
ipconfig /displaydns | more
注意:nslookup
不查看 hosts 文件。请参阅NSLOOKUP 和 NBLOOKUP 给出一个 IP 地址;PING 找到另一个
2. 基础知识
- 您的 hosts 文件命名正确吗?应该是
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 控制图片来指示控制字符。(不要将这些内容复制并粘贴到您的 hosts 文件中!)
192.0.2.1␉www.example.com␍␊
2001:db8:8:4::2␉ipv6.example.com␍␊
各个字节可以查看记事本++与十六进制编辑器插件。Notepad++ 还将显示特殊字符(查看 -> 显示符号),以便您可以轻松检查空格字符的数量和种类。
如果您从某处复制并粘贴了 hosts 条目,则可能会出现多个空格。理论上,hosts 支持将两列分隔开的多个空格,但如果没有其他方法,则需要尝试其他方法。
为了安全起见,请确保 hosts 文件中的所有行都使用制表符或空格,而不是同时使用两者。
最后,用一个空白行终止文件。
4. 注册表项
有一个注册表项指定 hosts 文件的位置。据说,Windows 实际上不支持将 hosts 文件放在其他位置,但您可能需要检查一下。该键是:
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DataBasePath
该条目应该是:
%SystemRoot%\System32\drivers\etc
或者,在命令提示符窗口中键入:
reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -v DataBasePath
将显示类似以下内容的内容:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
DataBasePath REG_EXPAND_SZ %SystemRoot%\System32\drivers\etc
5. 权限
有时文件权限、文件属性和类似内容存在问题。要使用默认权限重新创建文件:
- 在桌面上创建一个新的文本文件。
- 将当前主机文件的内容复制并粘贴到记事本中的此文件中。
- 保存新的文本文件并将其重命名为
hosts
。 - 复制 (不要动) 将文件复制到您的
%SystemRoot%\System32\drivers\etc
目录,并覆盖旧文件。
最后一点很重要:复制有效,移动无效。
本地Users
帐户必须能够读取 hosts 文件. 确认(在 Windows 7 中):
- 在 Windows 资源管理器中导航到
%SystemRoot%\System32\drivers\etc
。 - 如果你看不到该
hosts
文件,确保您可以看到隐藏文件和系统文件。 - 右键单击该
hosts
文件并Properties
从上下文菜单中选择。 - 在
hosts Properties
窗口中,单击Security
选项卡。 - 检查框中的名称列表
Group or user names:
。如果%COMPUTERNAME%\Users
存在,请单击它以查看权限。 - 如果
Users
不存在,或者存在但没有Read
权限,请单击Edit...
。 - 如果
Users
不存在,请单击Add...
,键入Users
,单击Check Names
,然后单击“确定”或按 Enter。 - 选择
Users
,并确保栏位Read & execute
已勾选Allow
。点击 OK。如果Windows Security
弹出警告框,选择Yes
继续。 - 单击“确定”关闭
hosts Properties
窗口。 - 转到此答案的第 1 部分并按照说明检查它现在是否正常工作。
或者,在命令提示符窗口中键入:
icacls %SystemRoot%\System32\drivers\etc\hosts
应该显示类似以下内容的内容:
C:\WINDOWS\System32\drivers\etc\hosts NT AUTHORITY\SYSTEM:(F)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
您应该会看到一个(R)
之后BUILTIN\Users
。
6. 编码
hosts 文件应采用 ANSI 或 UTF-8(无 BOM)编码。您可以通过“文件”->“另存为”执行此操作。
7. 代理
如果您配置了代理,它可能会绕过 hosts 文件。解决方案是不使用代理,或将其配置为不执行此操作。
要检查,请转到 Internet Explorer -> Internet 选项 -> 连接 -> LAN 设置。如果所有内容均为空白,并且已选中“自动检测设置”,则表示您未使用代理。
如果您依赖代理访问网络,因此不想禁用它,您可以通过转到 Internet Explorer -> Internet 选项 -> 连接 -> LAN 设置 -> 代理服务器/高级来添加例外。然后将您的例外添加到例外文本框中。例如localhost;127.0.0.1;*.dev
8.DNS 地址
(这也可能解决代理问题。)
转到网络连接属性,然后转到 TCP/IP 设置,并将第一个 DNS 服务器更改为127.0.0.1
(localhost)。第二个服务器可能应该是您实际 DNS 的 IP。
这对于 hosts 文件的工作来说不是必需的,但如果配置有些奇怪,它可能会对你有所帮助。
9. .local 地址
如果您使用 myhost.local 形式的 .local 域名条目并且它被忽略,请尝试以下操作:
x.x.x.x myhost.local www.myhost.local
即使www.myhost.local不存在。Windows 不知为何没有附加其工作组或本地域。
10. 行数/计数限制
(添加到这个答案中以使其可见,因为它已被提到过几次)
Windows hosts 文件似乎有行数或主机数限制。如果一行中有超过 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
尝试这个:
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
答案2
确保您已先输入 ipaddress,然后再输入“域”,如下所示:
127.0.0.1 bo.dev
127.0.0.1 www.bo.dev
答案3
请添加检查文件权限。我发现,即使我对计算机以及主机具有本地管理员权限。直到我为主机文件添加了本地用户权限(具有读取和读取和执行权限),然后执行 ipconfig /flushdns,主机才变为活动状态。
答案4
我遇到了同样的问题,hosts 文件条目被忽略。我尝试了此帖子和许多其他帖子中的所有方法,但都没有成功。我想我会发布对我有用的方法,以防其他人遇到这种情况。
- 以管理员身份打开 Windows 资源管理器
- 删除 hosts 文件
- 以管理员身份打开记事本并创建一个新的 hosts 文件
- 从头开始并添加条目。
- 确保 hosts 文件没有 .txt 扩展名
注意:简单地打开 hosts 文件并删除内容,验证其大小为 0kb 并重新添加它不起作用。我怀疑该文件存在权限问题。