主機文件被忽略,如何排除故障?
Windows 電腦上的 hosts 文件用於將某些名稱字元串綁定到特定 IP 地址,以覆蓋其他名稱解析方法。
通常,人們決定更改主機文件,並發現更改拒絕生效,或者甚至主機文件的舊條目此後都被忽略了。許多“陷阱”錯誤都可能導致這種情況,找出哪個錯誤可能會令人沮喪。
當面對 Windows 忽略主機文件的問題時,可以遵循的綜合故障排除協議是什麼?
這個問題在 SO 上有重複,例如HOSTS 文件被忽略
但是,這些傾向於處理特定情況,一旦發現OP犯的任何錯誤,討論就結束了。如果你碰巧沒有犯同樣的錯誤,那麼這樣的討論就不是很有用了。所以我認為有一個通用的協議來解決所有與主機相關的問題會更有幫助,涵蓋所有情況。
根據我自己的經驗和我在Google搜尋時遇到的情況,這裡有一些事情可以嘗試:
1.您檢查它是否正常工作?
對主機的更改應立即生效,但 Windows 會記憶體名稱解析數據,因此可能會在一段時間內使用舊記錄。打開命令行 (Windows+R,
cmd
, Enter) 並輸入:ipconfig /flushdns
刪除舊數據。要檢查它是否有效,請使用(假設您的主機中有一個用於www.example.com的 ipv4 條目,或者在您的主機中有一個用於 ipv6.example.com 的 ipv6 條目):
ping -4 www.example.com -n 1 ping -6 www.example.com -n 1
並查看它是否使用正確的 IP。如果是,則您的主機文件很好,問題出在其他地方。
此外,您可以使用以下命令重置 NetBios 記憶體(以管理員身份打開控制台,否則將失敗):
nbtstat -R
您可以使用以下命令檢查 DNS 記憶體中的目前數據:
ipconfig /displaydns | more
注意:
nslookup
不查看主機文件。見NSLOOKUP 和 NBLOOKUP 給出一個 IP 地址;PING 找到另一個
- 基礎
- 您的主機文件命名正確嗎?它應該是
hosts
而不是host
等等。- 副檔名是否正確?它應該沒有副檔名(
hosts
不是hosts.txt
) - 如果您已將視窗配置為隱藏已知副檔名,請小心檢查屬性以確保:正確的主機文件類型將顯示為“文件”。- 您是否遵循正確的語法?您是否不小心在行前加上
#
表示註釋的雜湊 ( )?- 您是否處理了所有變體(
www.example.com
並且example.com
- 最安全的是同時添加兩者)?3.空白
每行的格式是
IP address
,然後是水平製表符(轉義碼\t
,ASCIIHT
,十六進制0x09
)或單個空格(十六進制0x20
),然後是主機名,即。www.example.com
,最後是輸入,然後是換行符(轉義碼\r\n
、ASCIICRLF
、十六進制0x0d 0x0a
)。範例條目,使用 Unicode 控製圖片來表示控製字元。(不要將這些複製並粘貼到您的主機文件中!)
192.0.2.1␉www.example.com␍␊ 2001:db8:8:4::2␉ipv6.example.com␍␊
可以使用十六進制編輯器外掛在Notepad++中查看各個字節。Notepad++ 還將顯示特殊字元(查看 -> 顯示符號),因此您可以輕鬆檢查空白字元的數量和種類。
如果您從某處複製和粘貼主機條目,您可能會得到多個空格。理論上 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
- 權限
有時文件的權限、文件屬性和類似的東西會出現問題。要使用預設權限重新創建文件:
- 在桌面上創建一個新的文本文件。
- 將目前主機文件的內容複製並粘貼到記事本中的此文件中。
- 保存新的文本文件並將其重命名為
hosts
.- 將文件複製(不要移動)到您的
%SystemRoot%\System32\drivers\etc
目錄,並覆蓋舊文件。最後一點很重要:複製有效,移動無效。
本地
Users
帳戶必須能夠讀取主機文件。確保(在 Windows 7 中):
%SystemRoot%\System32\drivers\etc
在 Windows 資源管理器中導航到。- 如果看不到
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
列中選中。點擊確定。如果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)
afterBUILTIN\Users
。
- 編碼
主機文件應以 ANSI 或 UTF-8 編碼,無需 BOM。您可以使用文件 -> 另存為來執行此操作。
- 代理
如果您配置了代理,它可能會繞過主機文件。解決方案是不使用代理,或者將其配置為不這樣做。
要檢查,請轉到您的 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 文件正常工作所必需的,但如果某些配置異常,它可能會對您有所幫助。
- .本地地址
如果您使用 myhost.local 形式的 .local 域條目並且它被忽略,請嘗試以下操作:
x.x.x.x myhost.local www.myhost.local
即使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
試試這個:
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