hostsファイルに書いたホスト名が反映されない問題で試した方法と原因、解決策についてまとめてみました。

症状

僕の場合はChromeでは名前解決できるのに、IEやpingではダメという状態になりました。

hostsファイルの中身

まずはhostsファイル(C:\Windows\System32\drivers\etc)の中身。

127.0.0.1       localhost abc1.localhost abc2.localhost abc3.localhost abc4.localhost abc5.localhost abc6.localhost abc7.localhost abc8.localhost abc9.localhost

全部で10個のホスト名を127.0.0.1に振り向けています。

このうち、abc9.localhostについてのみ、IEなどで名前解決できない状態になりました。

(本当は15個くらいあったのですが、表記上10個にしています。)

環境

  • Windows 10

名前解決の確認方法

名前解決ができているかどうかは、pingが通るかどうかで確認します。

ping abc.localhost

NGの場合はこうなります。

C:\WINDOWS\system32>ping abc9.localhost
ping 要求ではホスト abc9.localhost が見つかりませんでした。ホスト名を確認してもう一度実行してください。

OKの場合はこうなるはずです。

C:\WINDOWS\system32>ping abc9.localhost
abc9.localhost [127.0.0.1]に ping を送信しています 32 バイトのデータ:
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
...

1) DNSキャッシュのクリア

まずは定番のDNSキャッシュのクリアです。

ipconfig /flushdns
ipconfig /displaydns

しかし、状態は変わらずでした。

2) hostsファイルのアクセス権限

ファイルのアクセス権限をいじれば治ったという書き込みを見たので、ファイルにEveryoneフルコントロールのアクセス権限を追加してみました。
しかし、これも効果ありません。

セキュリティ上よくないのでアクセス権限は元に戻しておきます。

3) 1行あたりのホスト名制限

なんとWindowsのhostsファイルは1行あたりのホスト名に最大9個までという制限があるそうです。

http://superuser.com/a/932113

確認してみると僕のhostsファイルには1行あたり10個以上のホスト名を記載していました。この情報に従って1行あたり9個までとなるようにhostsファイルを修正しました。

127.0.0.1       localhost abc1.localhost abc2.localhost abc3.localhost abc4.localhost abc5.localhost abc6.localhost abc7.localhost abc8.localhost
127.0.0.1       abc9.localhost

ただ、修正してもpingがまだ通りません。。

4) hostsファイルを1回削除してみる

何らかの理由により、hostsファイルの変更が検知できないような状態になっていると考え、一旦hostsファイルを削除してみることにしました。
もちろんファイルは別名のファイルに退避しておきます。具体的には以下の手順です。

cd C:\Windows\System32\drivers\etc
mv hosts hosts.bak
mv hosts.bak hosts

これでhostsファイルが正しく認識し、すべてのホスト名が名前解決できるようになりました。

まとめ

今回のケースでは1行に10個以上のホスト名を書いたことが原因でした。Chromeでは10個以上でも問題なく認識していたのですが、Chromeは独自にhostsファイルを読みに行っているのかもしれませんね。

また、hostsファイルの変更を検知させるためにファイルを一旦削除する方法が有効でした。これも1つの発見でした。