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;
                }
            }
        }
    }

 

RestTemplate是Spring框架提供的一个用于发送HTTP请求的工具类。在使用RestTemplate发送GET请求时,默认会自动处理重定向,并返回最终的响应结果。然而,有时我们需要获取重定向后的地址,而不是最终的响应结果。 解决这个问题的方法有两种: 方法1:使用自定义的HttpComponentsClientHttpRequestFactory来取消自动重定向。首先创建一个RestTemplate实例,然后创建一个HttpComponentsClientHttpRequestFactory实例,并设置一个自定义的HttpClient,该HttpClient使用LaxRedirectStrategy来处理重定向。最后将HttpComponentsClientHttpRequestFactory设置为RestTemplate的请求工厂。 方法2:在重定向之前,从响应header获取真实的地址Location,并将其存储在HttpContext。在第二次调用时,从HttpContext获取真实地址,并将其设置到请求的header,这样就能在最终的返回结果获取重定向后的地址。 根据你提供的引用内容,你可以选择其一种方法来解决获取重定向地址的问题。 #### 引用[.reference_title] - *1* [Spring的RestTemplate访问重定向地址获取30*原始返回数据,而不是继续重定向](https://blog.csdn.net/yangyangye/article/details/127282700)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Spring的RestTemplate自动重定向,如何拿到重定向后的地址?](https://blog.csdn.net/m0_37657841/article/details/107391699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值