绑host绕开域名解析

在windows环境下使用一些D版软件时,大家有时需要将软件的激活域名映射到本机(127.0.0.1)上,添加这种映射关系时需要编辑win环境中的hosts文件C:\Windows\System32\drivers\etc\hosts文件。在linux环境下也同样存在同样功能的文件,此文件位于/etc/下名为hosts,通过编辑这个文件就可以直接为某些域名指定特定的IP,这样以来就可以绕开域名去local dns上解析。

在之前的博文中,我曾分享过使用jsoup抓取其他网站图片的方法,今天我在转载那篇《从输入 URL 到页面加载完成的过程中都发生了什么事情?》文章时,后台从fex.baidu.com这个站点下载图片时出了些问题,没能将文章中的图片下载到本站。当时后台报了如下异常:

2014-05-25 08:30:22,021 IGNORE 下载[http://fex.baidu.com/img/what-happen/clearpad-i2c.png]失败!
java.net.UnknownHostException: fex.baidu.com
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
at sun.net.www.http.HttpClient.(HttpClient.java:211)
at sun.net.www.http.HttpClient.New(HttpClient.java:308)
at sun.net.www.http.HttpClient.New(HttpClient.java:326)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:996)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:932)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:850)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1300)

图片下载失败,但文章中的图片一样能正常显示,不过我还是不大喜欢直接引用站外图片地址,所以就想解决一下这个问题。

从异常来看,是服务器不能找到fex.baidu.com这台服务器,我在本地和服务器上分别ping了一下这个地址,本地是可以ping通的,如下:

C:\Users\woodman>ping  fex.baidu.com
正在 Ping duapp.n.shifen.com [180.149.132.32] 具有 32 字节的数据:
来自 180.149.132.32 的回复: 字节=32 时间=98ms TTL=54
来自 180.149.132.32 的回复: 字节=32 时间=104ms TTL=54
来自 180.149.132.32 的回复: 字节=32 时间=100ms TTL=54
来自 180.149.132.32 的回复: 字节=32 时间=122ms TTL=54
180.149.132.32 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 98ms,最长 = 122ms,平均 = 106ms

但是在服务器端执行ping时,会出错,如下所示:

[root@XXXXX x]# ping fex.baidu.com
ping: unknown host fex.baidu.com

故而,我将在本地ping响应的地址直接加到服务器/etc/hosts文件中后,在次执行ping命令就可以了,如下:

[root@XXXXX x]# ping fex.baidu.com
PING fex.baidu.com (180.149.132.32) 56(84) bytes of data.
64 bytes from fex.baidu.com (180.149.132.32): icmp_seq=1 ttl=51 time=214 ms
64 bytes from fex.baidu.com (180.149.132.32): icmp_seq=2 ttl=51 time=212 ms
64 bytes from fex.baidu.com (180.149.132.32): icmp_seq=3 ttl=51 time=200 ms
64 bytes from fex.baidu.com (180.149.132.32): icmp_seq=4 ttl=51 time=209 ms
^C
--- fex.baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3629ms

然后重新编辑了一下那篇文章,文章中的图片就被顺利抓取到自己的服务器上了。

其实这个hosts文件在软件开发部署的时候,是应当特别注意的。在我工作的上家公司的某个项目中,因为没有在应用服务器所在机器的hosts文件中配置db服务器的机器名和IP信息导致建立数据库连接的时候浪费了大量的时间,虽然这种问题对于有经验的人来说解决起来很快,但对于一些经验不够丰富的开发人员而言,会浪费大量的时间去定位问题。