PHP中的CURL是一种强大的工具,可以帮助我们创建web请求并与远程服务器进行通信。在开发中,有时我们需要跟随其中的重定向或转发请求,并且需要不断地获取服务器的返回数据。这时,就可以使用CURL的Follow选项,让我们来看看这个选项怎么用。我们可以使用CURLOPT_FOLLOWLOCATION选项来设置跟随重定向,例如:
$ch = curl_init("http://example.com");curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);$res = curl_exec($ch);if($res === false) {echo 'curl error: ' . curl_error($ch);}curl_close($ch);echo $res;
在上面的例子中,$ch是CURL句柄,我们使用curl_setopt设置了CURLOPT_FOLLOWLOCATION选项为true,表示要跟随重定向。之后,我们使用curl_exec来执行请求,并根据返回结果$res来判断是否出错,最后关闭CURL。但是,有时我们需要设置CURL的最大跟随次数,默认情况下是20。如果要修改这个限制,可以使用CURLOPT_MAXREDIRS选项。例如,如果我们需要跟随50次:
$ch = curl_init("http://example.com");curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);curl_setopt($ch, CURLOPT_MAXREDIRS, 50);$res = curl_exec($ch);if($res === false) {echo 'curl error: ' . curl_error($ch);}curl_close($ch);echo $res;
除了重定向之外,我们还可以跟随请求中的301或302状态码。例如,如果我们要抓取某个网站的登录页面,但这个网站会将未登录的用户重定向至登录页面,那么我们可以使用CURLOPT_FOLLOWLOCATION选项来自动跟随这个重定向,达到自动登录的目的。
$ch = curl_init("http://example.com/login");curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);$res = curl_exec($ch);if($res === false) {echo 'curl error: ' . curl_error($ch);}curl_close($ch);echo $res;
但是,有时我们需要跳过某些特定的重定向,例如,我们访问的网站做了权限判断,未登录用户无法访问特定页面,当我们发送请求时,服务器返回302状态码并重定向至登录页面,这时我们需要手动跳过这个重定向,才能获得想要的页面。我们可以使用CURLOPT_FOLLOWLOCATION选项配合CURLOPT_HEADER选项和CURLOPT_RETURNTRANSFER选项来实现:
$ch = curl_init("http://example.com/page");curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_HEADER, true);$res = curl_exec($ch);if($res === false) {echo 'curl error: ' . curl_error($ch);}// 获取返回头信息$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);$header = substr($res, 0, $header_size);// 如果返回302状态码,并且返回头信息中有Location字段,则跳过重定向if(preg_match('/^HTTP\/\d\.\d 302/', $header) && preg_match('/Location: (.+)/', $header, $match)) {$url = trim($match[1]);curl_setopt($ch, CURLOPT_URL, $url);$res = curl_exec($ch);}curl_close($ch);echo $res;
在上面的例子中,我们通过设置CURLOPT_HEADER选项为true,使CURL返回头信息和请求内容,并通过curl_getinfo获取头信息长度$header_size和正则表达式获取返回头信息中的状态码和重定向地址。在判断重定向时,我们利用CURLOPT_URL选项来设置跳过重定向后的URL,并重新执行curl_exec获取跳过重定向后的内容。最后关闭CURL,输出结果。总之,CURL的Follow选项可以帮助我们实现跟随重定向和跳过特定的重定向,使我们的web请求更加高效和方便。