我有几个问题,请帮忙:
首先,我只需输入 即可访问 Google 搜索http://74.125.224.211
,因为这是 nslookup 返回的 IP 地址。
但是我无法使用 www.yahoo.com 返回的 IP 地址来做到这一点。如何通过 IP 进入 Yahoo 搜索页面?
另一个例子,http://www.allaboutcircuits.com
将通过 DNS 服务器解析到68.233.243.63
,但如果我转到http://68.233.243.63
,我会得到“Hello world!”。
其次,由于某种原因,我的网络托管服务的 DNS 解析器出现了问题(它不会被修复!!). 因此命令如下
get_file_contents("http://www.allaboutcircuits.com");
将返回php_network_getaddresses: getaddrinfo failed: Name or service not known
我该如何利用 IP 地址来解决这个问题?
68.233.243.63
我的意思是,以某种方式将 HTTP 主机名参数附加到get_file_contents()
?
我希望自己(用我的代码)解决这个问题,服务器管理员不会进行任何故障排除/调整。
答案1
在您的 PHP 脚本中,当您通过 IP 地址访问它时,您还需要Host:
在请求中发送一个带有正确域名的标头。
Stack Overflow 上的这个问题解释了如何做到这一点:https://stackoverflow.com/questions/356705/how-to-send-a-header-using-a-http-request-through-a-curl-call
答案2
正如 wallyk 所说,它是虚拟服务器
以 Apache 为例
<VirtualHost *:80>
ServerName example2.com
DocumentRoot C:/www/example2.com
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
DocumentRoot C:/www/example.com
</VirtualHost>
在 c:\www\example.com 中创建一个索引文件,内容为“Hello World! example.com”
在 c:\www\example2.com 中创建一个索引文件,内容为“Hello World! example2.com”
并将 hosts 文件更改为
127.0.0.1 example.com
127.0.0.1 example2.com
然后转到http://example.com 然后去http://example2.com
这就是你可以用一个 IP 地址访问多个网站的方法
所以基本上答案是,不,您将无法从该 IP 获取该网站。
答案3
您说您想手动指定主机名和 IP 地址,而不是依赖您无法控制的 DNS 服务器。查看file_get_contents 文档,我看到那里的评论者通过创建包含所需 Host: 标头的上下文解决了类似的问题。如下所示:
$context = stream_context_create(array('http' => array('header' => 'Host: www.allaboutcircuits.com')));
$data = file_get_contents('http://68.233.243.63/', 0, $context);
当然,请注意,手动指定主机名和 IP 地址的缺点是,如果 IP 地址将来发生变化(例如,如果网站转移到新的托管服务提供商),您的代码可能会停止工作,直到您手动更新 IP 地址。
答案4
其次,由于某种原因,我的网络托管服务的 DNS 解析器出现了问题(无法修复!!)
您可以在客户端使用另一个 DNS 服务器,以防它不是网络主机 - 8.8.8.8 和 8.8.8.6 由 Google 运行,而 4.4.4.2 是常见的备用服务器。名称台可以让你找到最快的。或者,你可以使用某种代理服务(我在 VPS 上运行自己的代理服务,或者使用 Tor,但还有其他选择)。
因为这是 PHP,所以更简单的选择是在另一个系统上运行代码。临时解决方案不可维护。