请教:如何指定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地址

解决方案 »

  1.   

    如果对方是单独的服务器,直接指定IP就行了,如果那边是一个IP多域名,除非知道端口,不然还是要域名发过去我看你是不了解DNS机制
      

  2.   


    服务器上有多个域名的多个站点,都是80端口,仅指定IP地址,web服务器会把请求发给默认站点,如果没有默认站点就是"Bad Request (Invalid Hostname)"
      

  3.   

    这种情况是单一入口,后面有DNS或者选择器跳转服务器/路径,只能发送域名过去如果下面每台机器都各自接入互联网,就可以查各自IP,但如果通过网关或者单一出口接入互联网,就没办法例如校园网,从外面只能找到网关的IP
    例如公司几台电脑各自有个web,内部有DNS,通过一根线接入ISP,外部只能找到网关IP,由它分发请求
      

  4.   

    你说的是主机配置“默认网关”吧,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/这里的问题跟我所说的是类似的。
      

  5.   

    既然这样,你用他给出的例子不行么?
    其实他的代码也是逐个IP尝试,不行的返回false,行的就得到结果
      

  6.   

    他的例子就是 用 ip  轮流抓的, 他几个ip都指向同一个域名, 
      

  7.   


     http://192.168.100.88:80/file.html  这样抓不到?
      

  8.   

    虽然dns把几个ip指向同一域名, 实际上你要访问的就是ip,  而不是域名,包括那个例子。
      

  9.   

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

  10.   

    从tcp/ip协议上分析,http请求是应用层的请求数据包,http请求包里面本身没有目标地址的ip地址,http请求包是要下发到网络层,在这里通过dns解析到目标主机的ip地址,并封装成ip数据包。
    所以,要实现上面所述的功能,必需干涉dns解析这一过程,如使用hosts文件,或者像张宴所用的“通过php建sock连接发送构造出来的http包”的办法。
    所以,我这里想找的是:php中是否一种简单的工具,可以便捷的实现这样“干涉dns解析”的功能?
      

  11.   


    根据第一, 二点
    你的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的服务器上做反向代理了, 
      

  12.   


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

  13.   


    我现在大概明白你的意思了,你在新的站点上运行一个php脚本, 这个站点有自己的主域名, ip , 
    你就用这个脚本分析用户的ip, 再根据你所要的情况是否调用本地内容, 还是远程内容,通过这样简单地实现反代理, 但我并不认为这个是好的注意, 
    必竟php属于http应用层的应用层的上层了, 效率之低可想而知。
      

  14.   

    是这样的。按这个思路做出来效率低是肯定的,只是觉得如果做个建立在php上的反向代理,是一件有意思的事情。其中“指定IP与域名抓取url内容”是一个最大的障碍,所以在这里请教高手来帮忙了。
    感谢不吝赐教!
      

  15.   

    你在google.com上搜索 "php proxy", "php reserve proxy" 能搜索到几个脚本,
    我以前用过这样的东西, 翻墙去抓facebook的内容, 
    原理就是通过第三服务器作为虚似的代理去抓取其它站上的东西, 通过http方式。里面的代码你可以参考修改下, 但我用了真不是很效率, 
    既然你觉得有意思, 不防一试,
      

  16.   

    上面打错英文, 悲剧, 应该是“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
      

  17.   

    http://topic.csdn.net/u/20080824/07/0125890f-9a98-4296-ad84-c5c748c17581.html
    这篇文章被加精了,对你应该很有用,你可以看看
      

  18.   

    求高手师傅,教我攻击别人IP 我 QQ1813038