请教:如何指定IP与域名抓取url内容

fengyqf 2011-05-28 06:30:09
请教:如何指定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地址
...全文
639 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq328975964 2012-02-11
  • 打赏
  • 举报
回复
求高手师傅,教我攻击别人IP 我 QQ1813038
YHL27 2011-05-31
  • 打赏
  • 举报
回复
很有意义哦
骄傲青蛙 2011-05-30
  • 打赏
  • 举报
回复
上面打错英文, 悲剧, 应该是

“php reverse proxy”

http://www.google.com/#hl=en&sugexp=ldymls&xhr=t&q=php+reverse+proxy&cp=7&pf=p&sclient=psy&source=hp&aq=0c&aqi=&aql=&oq=php+rev+proxy&pbx=1&bav=on.2,or.r_gc.r_pw.&fp=f99e8c741a251b45&biw=800&bih=423
www_7di_net 2011-05-30
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080824/07/0125890f-9a98-4296-ad84-c5c748c17581.html
这篇文章被加精了,对你应该很有用,你可以看看
udbxkj663 2011-05-29
  • 打赏
  • 举报
回复
学习学习学习学习学习
骄傲青蛙 2011-05-29
  • 打赏
  • 举报
回复
上面说的, 不效率的原因, 也可能是第三方网络环境造成,
fengyqf 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 coolesting 的回复:]

引用 14 楼 fengyqf 的回复:

引用 13 楼 coolesting 的回复:


我这里还只是在举例讨论一种可能性,并没有真正开始这么做。
我有一个wordpress站点,在购买的虚拟主机上,但运行……

我现在大概明白你的意思了,

你在新的站点上运行一个php脚本, 这个站点有自己的主域名, ip ,
你就用这个脚本分析用户的ip, 再根据你……
[/Quote]
是这样的。按这个思路做出来效率低是肯定的,只是觉得如果做个建立在php上的反向代理,是一件有意思的事情。其中“指定IP与域名抓取url内容”是一个最大的障碍,所以在这里请教高手来帮忙了。
感谢不吝赐教!
骄傲青蛙 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fengyqf 的回复:]

引用 13 楼 coolesting 的回复:


我这里还只是在举例讨论一种可能性,并没有真正开始这么做。
我有一个wordpress站点,在购买的虚拟主机上,但运行……
[/Quote]



我现在大概明白你的意思了,

你在新的站点上运行一个php脚本, 这个站点有自己的主域名, ip ,
你就用这个脚本分析用户的ip, 再根据你所要的情况是否调用本地内容, 还是远程内容,

通过这样简单地实现反代理, 但我并不认为这个是好的注意,
必竟php属于http应用层的应用层的上层了, 效率之低可想而知。
fengyqf 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 coolesting 的回复:]
根据第一, 二点
你的dns和ip都在同一台机上吗?

192.168.100.88上只有一个站点, 配了四个域名,没有默认指向, 如果你随便访问一个域名, 都会指向这个ip吗 ?
------------……
[/Quote]

我这里还只是在举例讨论一种可能性,并没有真正开始这么做。
我有一个wordpress站点,在购买的虚拟主机上,但运行速度比较慢,就像上面所说;最近了解了一点反向代理,突发了这个奇想:能否使用另外的一个虚拟主机实现类似反向代理的功能。
请求在虚拟主机上站点的页面,只用ip地址是肯定不行的。
骄傲青蛙 2011-05-29
  • 打赏
  • 举报
回复

根据第一, 二点
你的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的服务器上做反向代理了,
fengyqf 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 snmr_com 的回复:]

感觉像在做镜像……
[/Quote]
就是这样,一针见血! 呵呵
fengyqf 2011-05-29
  • 打赏
  • 举报
回复
从tcp/ip协议上分析,http请求是应用层的请求数据包,http请求包里面本身没有目标地址的ip地址,http请求包是要下发到网络层,在这里通过dns解析到目标主机的ip地址,并封装成ip数据包。
所以,要实现上面所述的功能,必需干涉dns解析这一过程,如使用hosts文件,或者像张宴所用的“通过php建sock连接发送构造出来的http包”的办法。
所以,我这里想找的是:php中是否一种简单的工具,可以便捷的实现这样“干涉dns解析”的功能?
ImN1 2011-05-29
  • 打赏
  • 举报
回复
感觉像在做镜像……
fengyqf 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 coolesting 的回复:]
http://192.168.100.88:80/file.html

这样抓不到?
[/Quote]
如果192.168.100.88上只有一个站点,且被设置为默认站点是可以的,不加端口号:80也可以的;但如果192.168.100.88上有多个虚拟主机站点就不行了

我在上面没有说清楚,我再描述一下:

有一个wordpress站点,插件比较多,效率很低(使用了wp super cache插件,一个页面单程序执行都要花费1秒钟之久,执行50个sql语句),想用php写个类似“反向代理”的缓存程序。————其实这完全是突发奇想,不一定可行。

环境:
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,是否可以实现这样的功能呢?



骄傲青蛙 2011-05-28
  • 打赏
  • 举报
回复
虽然dns把几个ip指向同一域名, 实际上你要访问的就是ip, 而不是域名,包括那个例子。
骄傲青蛙 2011-05-28
  • 打赏
  • 举报
回复

http://192.168.100.88:80/file.html

这样抓不到?
骄傲青蛙 2011-05-28
  • 打赏
  • 举报
回复
他的例子就是 用 ip 轮流抓的, 他几个ip都指向同一个域名,
ImN1 2011-05-28
  • 打赏
  • 举报
回复
既然这样,你用他给出的例子不行么?


其实他的代码也是逐个IP尝试,不行的返回false,行的就得到结果
fengyqf 2011-05-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 snmr_com 的回复:]

这种情况是单一入口,后面有DNS或者选择器跳转服务器/路径,只能发送域名过去

如果下面每台机器都各自接入互联网,就可以查各自IP,但如果通过网关或者单一出口接入互联网,就没办法

例如校园网,从外面只能找到网关的IP
例如公司几台电脑各自有个web,内部有DNS,通过一根线接入ISP,外部只能找到网关IP,由它分发请求
[/Quote]
你说的是主机配置“默认网关”吧,curl_setopt()有个配置项CURLOPT_INTERFACE好像就是指使用哪个默认网关的,前提是配置了多网卡。

但我所说并不是这样,举个例子吧:
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/这里的问题跟我所说的是类似的。
ImN1 2011-05-28
  • 打赏
  • 举报
回复
这种情况是单一入口,后面有DNS或者选择器跳转服务器/路径,只能发送域名过去

如果下面每台机器都各自接入互联网,就可以查各自IP,但如果通过网关或者单一出口接入互联网,就没办法

例如校园网,从外面只能找到网关的IP
例如公司几台电脑各自有个web,内部有DNS,通过一根线接入ISP,外部只能找到网关IP,由它分发请求
加载更多回复(2)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧