最近遇到一个问题,就是如何在curl请求某个域名的时候,可以指定某个ip访问,因为很多时候咱们的域名对应的是集群,会有很多服务器ip,并不一定是刚好访问到你想要的服务器,那么该如何解决呢?
例如:正常情况下,假设我们这样发送请求,如何指定访问114.253.192.75这个ip服务器的内容
$url = "https://www.diekaisanyue.com/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //https请求,不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$content = curl_exec($ch);
echo $content;
解决方法:
1、配置/etc/host文件,加入114.253.192.75 www.diekaisanyue.com的指向,虽然可以实现效果,但是不利于维护,换一个同事操作估计还不清楚已经配置host。
2、修改在114.253.192.75服务器上部署的www.diekaisanyue.com vhost文件,单独开一个端口,例如端口8888,则我们可以直接使用114.253.192.75:8888进行访问,但是也不很方便,如果下次换一台服务器又需要开个端口配置一遍。
3、将请求url中域名改用ip方式,然后加上Host请求头信息,进行请求,这种方法好处就是什么都不用修改,也不用配置,可以直接指定你想要的ip服务器进行访问,通过header里面的host信息,进行配对服务。
$url = 'https://114.253.192.75/index.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: www.diekaisanyue.com"));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$content = curl_exec($ch);
echo $content;
4、php5.5以上版本,支持使用 CURLOPT_RESOLVE 来设置主机对应的ip地址,但是经过测试好像不起作用
$url = 'https://www.diekaisanyue.com/index.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_RESOLVE, ["www.diekaisanyue.com:443:114.253.192.75"]);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$content = curl_exec($ch);
echo $content;