设定情景:一个网站的域名(www.xxx.com)对应的公网ip是一个cdn的IP,但是你想访问该域名的真实IP;这样的情景我们就可以用curl中的CURLOPT_RESOLVE配置来重写host
自己写了一个函数供大家参考:
/**
* 发送http请求方法,并且重写host
* @param string $url 请求URL
* @param array $params 请求参数
* @param string $method 请求方法GET/POST
* @param array $resolve 重写配置 (例如:array("www.haoxitong.com:443:192.168.78.128"))
* @param array $header
* @return array $data 响应数据
* @throws Exception
*/
function curl_http_resolve($url, $params = array(), $method = 'GET',$resolve = null, $header = array() ){
$opts = array(
CURLOPT_TIMEOUT => 300,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_CONNECTTIMEOUT => 100,
CURLOPT_HTTPHEADER => $header
);
if(!empty($resolve)){
$opts[CURLOPT_RESOLVE] = $resolve;
}
/* 根据请求类型设置特定参数 */
switch (strtoupper($method)) {
case 'GET':
$opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
break;
case 'POST':
//判断是否传输文件
$params = http_build_query($params);
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_POST] = 1;
$opts[CURLOPT_POSTFIELDS] = $params;
break;
default:
throw new Exception('不支持的请求方式!');
}
/* 初始化并执行curl请求 */
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
throw new Exception('请求发生错误:' . $error);
}
return $data;
}注意:$resolve参数必须为数组,其值以域名、端口号、自定义ip,用冒号拼接
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号