Windows计算机上的hosts文件被用来将某些名称字符串与特定的IP地址绑定,以覆盖其他名称解析方法。
通常,人们决定改变hosts文件,然后发现这些改变拒绝生效,或者甚至hosts文件的旧条目此后也被忽略了。许多错误都会导致这种情况,要找出其中的原因可能会很令人沮丧。
当遇到Windows忽略hosts文件的问题时,可以遵循的综合故障排除协议是什么?
这个问题在SO上有重复,如https://serverfault.com/questions/50934/hosts-file-being-ignored
然而,这些问题往往涉及到一个特定的案例,一旦发现OP所犯的任何错误,讨论就结束了。如果你没有碰巧犯过同样的错误,这样的讨论就没有什么用处。因此,我认为有一个解决所有与主机有关的问题的一般协议会更有帮助,它将涵盖所有的情况。
根据我自己的经验和我在Googling时遇到的情况,这里有一些事情可以尝试。
对主机的修改应该立即生效,但Windows缓存了名称解析数据,因此在一段时间内可能会使用旧的记录。打开命令行(Windows+R, cmd
, Enter)并输入。
ipconfig /flushdns
来删除旧数据。要检查它是否有效,请使用(假设你在主机中的ipv4条目是www.example.com,或在主机中的ipv6条目是ipv6.example.com)。
ping www.example.com -n 1
ping -6 ipv6.example.com -n 1
然后看看它是否使用了正确的IP。如果是,说明你的hosts文件没有问题,问题出在其他地方。 另外,你可以用(以管理员身份打开控制台,否则会失败)重置NetBios的缓存。
nbtstat -R
你可以用以下方法检查DNS缓存中的当前数据。
ipconfig /displaydns | more
hosts
而不是host
,等等。hosts
而不是hosts.txt
)--如果你将windows配置为隐藏已知的扩展名,请注意检查属性以确定:正确的hosts文件'的类型将显示为只有"文件"。#
)?www.example.com
和example.com
--最安全的做法是把两者都加上)?每一行的格式是:IP地址',然后是一个水平制表符(转义代码
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␍␊
各个字节可以在Notepad++中通过十六进制编辑器插件查看。Notepad++也会显示特殊字符(View -> Show Symbol),所以你可以很容易地检查出空白字符的数量和种类。 如果你从某个地方复制和粘贴hosts条目,你可能最终会出现多个空格。理论上,hosts支持多个空格分隔两列,但如果没有其他办法,这也是另一种尝试。 为了安全起见,确保你的hosts文件中的所有行都使用制表符或空格,而不是同时使用。 最后,用一个空行来结束文件。
有一个注册表键指定了hosts文件的位置。据称,Windows实际上不支持将主机文件放在其他位置,但你可能想检查一下。该键值是
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DataBasePath
条目应该是。
%SystemRoot%\System32\drivers\etc
有时候,文件的权限、文件的属性以及类似的东西会有问题。要用默认的权限重新创建文件。
1.在你的桌面上创建一个新的文本文件。
2.2. 用记事本把你当前hosts文件的内容复制并粘贴到这个文件中。
3.3. 保存新的文本文件并将其重命名为 "hosts"。
4.4.复制(不要移动)该文件到你的%SystemRoot%/System32/drivers/etc
目录,并覆盖旧文件。
最后一点很重要:复制可以,移动就不行了。
本地 "用户 "账户必须能够读取hosts文件。为了确保(在Windows 7中)。
1.在Windows Explorer中导航到%SystemRoot%/System32/drivers/etc
。
2.2. 如果你看不到hosts
文件,[确保你能看到隐藏文件和系统文件](https://superuser.com/questions/101999/how-do-you-show-hidden-system-folders-in-windows-7)。
3.3. 右键单击hosts
文件,从上下文菜单中选择属性'。 4.4. 在 "hosts属性 "窗口中,点击 "安全 "标签。 5.5. 检查 "组或用户名称:"框中的名称列表。如果"%COMPUTERNAME%Users "存在,点击它来查看权限。 7.如果
Users'不存在,或者存在但没有阅读'权限,点击
编辑...'。
8.如果 "用户 "不存在,点击 "添加...",输入 "用户",点击 "检查名称",然后点击 "确定 "或按回车。
9.9. 选择 "用户",并确保在 "允许 "一栏中勾选 "阅读& 执行"。点击确定。如果弹出一个 "Windows安全 "提示框,选择 "是 "继续。
11.点击 "确定",关闭 "主机属性 "窗口。
12.进入本答案的第1节,按照指示检查现在是否工作。
主机文件应以ANSI或UTF-8编码,没有BOM。你可以用文件->另存为来做到这一点。
如果你配置了一个代理,它可能会绕过hosts文件。解决办法是不使用代理,或将其配置为不这样做。
要检查,请进入你的Internet Explorer -> Internet Options -> Connections -> LAN settings。如果所有内容都是空白的,并且勾选了 "自动检测设置",则说明你没有使用代理。
如果你依赖代理访问网络,因此不想禁用它,你可以通过进入Internet Explorer -> Internet Options -> Connections -> LAN settings -> Proxy Server / Advanced添加例外。然后在例外情况文本框中添加你的例外情况。例如:localhost;127.0.0.1;*.dev
。
(这也可以解决代理问题)。
进入你的网络连接属性,然后是TCP/IP设置,把第一个DNS服务器改为127.0.0.1
(localhost)。第二个可能应该是你的实际DNS'的IP。
这不是主机文件工作的必要条件,但如果有些东西配置得很奇怪,可能对你的情况有帮助。
如果你使用的是myhost.local形式的.local域名条目,而它被忽略了,请尝试以下方法
x.x.x.x myhost.local www.myhost.local
即使 www.myhost.local 不存在。Windows不知为何没有附加其工作组或本地域。
在我的案例中,我尝试了Windows 7创建的文件。C:\Windows\System32\drivers\etc\hosts.ics。
hosts.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.
结果,Windows忽略了C:\Windows\System32\drivers\etc\hosts中的设置,而使用hosts.ics中的设置。