请教:如何指定IP与域名抓取url内容file_get_contents()这样的函数,只能指定域名或IP地址抓取url内容,但如果域名解析到的ip地址有误,如果既指定域名、又指定IP地址抓取URL呢?实际上就是,把一个http请求发送到指定的ip地址上,而不是请求包中的域名dns解析的地址上。
本质上是dns劫持,通过hosts文件可以实现,但修改hosts太麻烦、而且如果是虚拟主机则无法实现。所以想在php程序的层面上实现这样功能,请教达人!
这里倒是有一个参考方案: http://blog.s135.com/post/389/
使用一个自定义函数,通过php建sock连接发送构造出来的http包
但也比较麻烦,不知是否有简洁高效的办法:使用类似curl的库函数,在发http请求时仅仅多指定一个目标ip地址
本质上是dns劫持,通过hosts文件可以实现,但修改hosts太麻烦、而且如果是虚拟主机则无法实现。所以想在php程序的层面上实现这样功能,请教达人!
这里倒是有一个参考方案: http://blog.s135.com/post/389/
使用一个自定义函数,通过php建sock连接发送构造出来的http包
但也比较麻烦,不知是否有简洁高效的办法:使用类似curl的库函数,在发http请求时仅仅多指定一个目标ip地址
服务器上有多个域名的多个站点,都是80端口,仅指定IP地址,web服务器会把请求发给默认站点,如果没有默认站点就是"Bad Request (Invalid Hostname)"
例如公司几台电脑各自有个web,内部有DNS,通过一根线接入ISP,外部只能找到网关IP,由它分发请求
www.mydomain.com的dns解析指向到192.168.100.8
但我在192.168.100.88 的服务器上配置了一个web站点,域名是www.mydomain.com
我想在192.168.2.10的主机上通过php抓取192.168.100.88 上的http://www.mydomain.com/file.html
使用file_get_contents('http://www.mydomain.com/file.html')得到肯定是192.168.100.8上的页面。
当然在主机192.168.2.10配置hosts使它认为www.mydomain.com就在192.168.100.88上,这样是可以的;不过如果我没有权限修改192.168.2.10的hosts文件,就不行了。其实http://blog.s135.com/post/389/这里的问题跟我所说的是类似的。
其实他的代码也是逐个IP尝试,不行的返回false,行的就得到结果
http://192.168.100.88:80/file.html 这样抓不到?
1)192.168.100.88 上配置了多个web站点(没有配置默认站点),域名分别是www.mydomain.com, www.zhangsite.com,www.wangsite.com,www.lisite.com
2)域名www.mydomain.com的dns解析指向到192.168.2.10
3)192.168.2.10上也配置了站点www.mydomain.com
3)没有权限修改192.168.2.10上hosts文件目的:
在192.168.2.10的主机上通过php抓取192.168.100.88 上的http://www.mydomain.com/page.html,把page.html保存到192.168.2.10主机上的遇到问题:
file_get_contents('http://www.mydomain.com/file.html')是不行的,因为它请求的并不是192.168.100.88 !
如果在主机192.168.2.10配置hosts,强制它把www.mydomain.com解析到192.168.100.88上,就可以实现的.
但如果不修改hosts文件,而是单纯使用php,是否可以实现这样的功能呢?
所以,要实现上面所述的功能,必需干涉dns解析这一过程,如使用hosts文件,或者像张宴所用的“通过php建sock连接发送构造出来的http包”的办法。
所以,我这里想找的是:php中是否一种简单的工具,可以便捷的实现这样“干涉dns解析”的功能?
根据第一, 二点
你的dns和ip都在同一台机上吗?192.168.100.88上只有一个站点, 配了四个域名,没有默认指向, 如果你随便访问一个域名, 都会指向这个ip吗 ?
file_get_contents('http://www.mydomain.com/file.html')是不行的,因为它请求的并不是192.168.100.88
---------------------------------------------
他请求的不是192.168.100.88 因为你本身这个域名http://www.mydomain.com/根本没有配置到dns解释里, 你只不过是添加进清单, 没有指定要使用这个域名。或者你可以ping一下这域名和其它三域名分别解释到的ip是什么,
是动态的,随机的,还是你把这个域名分配到某个ip上。如果通过浏览器能直接访问http://www.mydomain.com/吗? 强制它把www.mydomain.com解析到192.168.100.88上
--------------------------------------------
这样做法, 和你在php脚本里写着直接访问192.168.100.88没区别
当php调用header时, 去服务器读取www.mydomain.com域名就被dns解释成了192.168.100.88
如果192.168.100.88上只有一个站点,且被设置为默认站点是可以的,不加端口号:80也可以的;但如果192.168.100.88上有多个虚拟主机站点就不行了
-------------------------------------------------------------------------
如果有多个虚似主机共用一个ip(192.168.100.88)和同一端口,
那你肯定要给这个ip的服务器上做反向代理了,
我这里还只是在举例讨论一种可能性,并没有真正开始这么做。
我有一个wordpress站点,在购买的虚拟主机上,但运行速度比较慢,就像上面所说;最近了解了一点反向代理,突发了这个奇想:能否使用另外的一个虚拟主机实现类似反向代理的功能。
请求在虚拟主机上站点的页面,只用ip地址是肯定不行的。
我现在大概明白你的意思了,你在新的站点上运行一个php脚本, 这个站点有自己的主域名, ip ,
你就用这个脚本分析用户的ip, 再根据你所要的情况是否调用本地内容, 还是远程内容,通过这样简单地实现反代理, 但我并不认为这个是好的注意,
必竟php属于http应用层的应用层的上层了, 效率之低可想而知。
感谢不吝赐教!
我以前用过这样的东西, 翻墙去抓facebook的内容,
原理就是通过第三服务器作为虚似的代理去抓取其它站上的东西, 通过http方式。里面的代码你可以参考修改下, 但我用了真不是很效率,
既然你觉得有意思, 不防一试,
这篇文章被加精了,对你应该很有用,你可以看看