php 获取响应头部信息 ,中的 Location 内容 ,并将 location 中 https地址重定向后,获取重定向地址

获取响应头部所有信息,核心代码信息



   /**
     * 获取相应头部信息 
     */
    public function curlPostHeader($url,$postData, $options = array()){
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HTTPHEADER,$options);
        // 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
        curl_setopt($ch, CURLOPT_HEADER, true); 
        // 
        // 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
        curl_setopt($ch, CURLOPT_NOBODY, true);

        // 使用上面定义的 ua
        // curl_setopt($ch, CURLOPT_USERAGENT,$user_agent);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        // 不同的点 开始 为 false
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
        //https请求 不验证证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        // 不同的点 结束 
        $data = curl_exec($ch);
        
        curl_close($ch);
        // print_r( $data);exit;
        return $data;        
    }

具体调用业务场景信息【注意参数内容自行修改】

    /**
     * 获取头像信息
     */
    public function get_visitor_pic($response){
        //请求参数
        $sign = $this->get_sign($response,$this->visitor_pic_url);
        $options = array(
            "Accept:".$this->accept,
            "Content-Type:".$this->content_type,
            "x-Ca-Key:".$this->app_key,
            "X-Ca-Signature:".$sign,
            "X-Ca-Timestamp:".$this->time,
            "X-Ca-Signature-Headers:"."x-ca-key,x-ca-timestamp",
        );
        $result = $this->curlPostHeader($this->pre_url.$this->visitor_pic_url,json_encode($response),$options);
        return $result;
    }

 对get_visitor_pic得到的 结果 ,进行数据处理 【得到 header Location地址】strpos(字符串,'判断是否存在的字符串') 返回 false 则不存在 

 

/** 调用上述封装的方法 **/
if(strpos($pic_img,"Location:") !== false){
    $pic_img = str_replace("Location:",'@@@@@',$pic_img);
    $pic_img = str_replace("X-Application-Context:",'@@@@@',$pic_img);
    $result = explode('@@@@@',$pic_img);
    $str = trim($result[1]);
    if($str != ''){

     /** 注意 此处将https 验证关闭 ,如若不设置 ,对应 get_headers 将报错 **/ 
     stream_context_set_default( [
       'ssl' => [
         'verify_host' => false,
         'verify_peer' => false,
         'verify_peer_name' => false,
        ],
     ]);
                   
     $header = get_headers($str, 1);
     $temp_data['picture'] = $header;     
     $header = get_headers($str, 1);
     $temp_data['picture'] = $header;
    }else{
     $temp_data['picture'] = '';
    }
}

 总结 使用 PHP CURL 获取响应头部信息

//1. 注意 curl中的配置信息

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER,$options);
// 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
curl_setopt($ch, CURLOPT_HEADER, true); 
// 
// 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
curl_setopt($ch, CURLOPT_NOBODY, true);

// 使用上面定义的 ua
// curl_setopt($ch, CURLOPT_USERAGENT,$user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

//2. 得到 header location 的内容后, 关闭https验证信息,获取真正的url地址信息

$header = 'https://www.baidu.com';
$header = str_replace("Location:",'@@@@@',$header);
$header = str_replace("X-Application-Context:",'@@@@@',$header);
$result = explode('@@@@@',$header);


//3.关闭 get_headers()方法的 https 验证信息 ,很重要 不然get_headers()方法报错

stream_context_set_default( [
    'ssl' => [
        'verify_host' => false,
        'verify_peer' => false,
        'verify_peer_name' => false,
    ],
]);

 $header = get_headers($result, 1);

//4. 字符串是否存在某个字符串
strpos(字符串,'判断是否存在的字符串') 返回 false 则不存在 

扩展 【获取最终的url地址时,根据响应状态码获取不同 判断得到的最终的URL地址 】

(版权声明:此处引用「hldh214」的原创文章
原文链接:https://blog.csdn.net/hldh214/article/details/51549740
)

// 此处 参考自文章 https://blog.csdn.net/hldh214/article/details/51549740  CSDN博主「hldh214」的原创文章

$header = get_headers($url, 1);
    //print_r($header);
    if (strpos($header[0], '301') !== false || strpos($header[0], '302') !== false) {
        // 检测到跳转
        if (array_key_exists('Set-Cookie', $header)) {
            // 检测到cookie, 进行设置
            $cookies = $header['Set-Cookie'];
            foreach ($cookies as $k => $v) {
                header('Set-Cookie: ' . $v);
            }
        }
        if (array_key_exists('Location', $header)) {
            $url = $header['Location'];
            if (is_array($url)) {
                foreach ($url as $k => $v) {
                    if (strpos($v, $rule) !== false) {
                        // 跳转地址与$rule匹配, 返回该地址
                        return $v;
                    } else {
                        // 不匹配则访问一次中转网址
                        file_get_contents($v);
                    }
                }
            } else {
                if (strpos($url, $rule) !== false) {
                    // 跳转地址与$rule匹配, 返回该地址
                    return $url;
                }
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值