php curl 301跳转怎么处理
时间 : 2023-02-13 10:52:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

PHP CURL 301跳转是一种HTTP状态码,表示请求资源已永久移动到其他位置。它由服务器发出,而客户端(浏览器)总是收到一个带有新位置的响应,并重定向到新位置。CURL 301跳转就是使用cURL程序来处理这些类型的响应。

处理PHP CURL 301跳转最简单的方法是使用CURLOPT_FOLLOWLOCATION参数,使curl能够跟随定义的重定向URL到新位置。在编写curl程序时,我们可以在CURLOPT_FOLLOWLOCATION参数值设定为TRUE,以允许curl跟随重定向的URL。例如:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

然而,有1个重要的限制,就是PHP CURL301跳转只能跟随5个HTTP重定向。如果你要处理更多的HTTP重定向,就必须更主动地使用cURL API来手动追踪总是在curl回调函数中设置和使用。因此,使用以下函数可以处理任意多的301跳转:

function curl_redir_exec($ch, & $redirects, $curlopt_header = false)

{

curl_setopt($ch, CURLOPT_HEADER, true);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch); $headers = curl_getinfo($ch);

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if($http_code == 301 || $http_code == 302) {

list($header) = explode("\r\n\r\n", $data, 2);

$matches = array(); preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);

$url = trim(array_pop($matches));

$url_parsed = parse_url($url);

if (isset($url_parsed))

{

$redirects++;

curl_setopt($ch, CURLOPT_URL, $url);

return curl_redir_exec($ch, $redirects, $curlopt_header);

}

}

if($curlopt_header) {

return array($data, $headers);

} else {

return $data;

}

}

此函数会自动处理无限多个301跳转,并且它返回所需要的响应数据。

PHP Curl 301跳转时处理方式有两种:1、由CURL自动处理;2、由程序处理。

一、由CURL自动处理301重定向的方式

这种方式是比较常用的,它首先会检测到301重定向,然后自动执行来访链接的新地址,并且保存新的cookie:

$curl = curl_init();// 初始化

curl_setopt($curl, CURLOPT_URL, $url); // 设置访问URL

curl_setopt($curl, CURLOPT_FOLLOWLOCATION,TRUE);// 允许内部跳转

curl_setopt($curl, CURLOPT_HEADER, 0); // 不将本次跳转保存到Header中

curl_exec($curl); //执行

?>

二、由程序处理301重定向的方式

这个处理方式用的比较少,我们可以主动检测到重定向,然后手动执行跳转,并且保存新的cookie:

$curl = curl_init($url);​

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);​

$data = curl_exec($curl);​

// 检查是否有301/302跳转 重定向 ​

$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);​

if($httpCode == 301 || $httpCode == 302){

             // 监测到重定向, 获取新链接:

             $location = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);

             curl_close($curl);

             // 继续使用PHP Curl 执行重定向链接:

             $curl2 = curl_init($location);

             curl_setopt($curl2, CURLOPT_RETURNTRANSFER, 1); 

             // 执行重定向链接

             $data = curl_exec($curl2);

             // 保存新的cookie:

             curl_setopt($curl2, CURLOPT_COOKIEJAR, 'cookie.txt');

             // 执行之后关闭curl:

             curl_close($curl2);

         }

?>

以上就是PHP Curl 301重定向时典型处理方式。通过设置CURLOPT_FOLLOWLOCATION我们可以实现重定向处理及其后续操作;也可以通过检查状态码,然后手动处理重定向。