CURLOPT_FOLLOWLOCATION不起作用

3
我正在尝试从以下链接中抓取数据: http://www.treasurydirect.gov/NP/BPDLogin?application=np 该链接包含一个元刷新(meta refresh)。
我正在使用带有CURLOPT_FOLLOWLOCATION设置为true的curl_exec。
在phpinfo()中,我确认safe mode和basedir未设置。然而,CURLOPT_FOLLOWLOCATION仍然无法正常工作。这是我的代码:
<?php 
error_reporting(E_ALL);

$url = 'http://www.treasurydirect.gov/NP/BPDLogin?application=np';

// READ THE WEB PAGE
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,20);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch,CURLOPT_COOKIEFILE,"cookies.txt");
curl_setopt($ch,CURLOPT_COOKIEJAR,"cookies.txt");
curl_error($ch);
$htm = curl_exec($ch);
curl_close($ch);

// MAKE OUR OUTPUT EASY TO READ
echo "<pre>";

// GET THE TITLE
$txt = strip_tags($htm, '<title>');
$rgx
= '#'            // REGEX DELIMITER - START
. '\<title\>'    // TITLE TAG WITH ANGLE BRACKETS ESCAPED - START
. '(.*?)'        // GROUP OF ANYTHING
. '\</title\>'   // TITLE TAG WITH ANGLE BRACKETS ESCAPED - END
. '#'            // REGEX DELIMITER - END
. 'is'           // CASE-INSENSITIVE, SINGLE LINE
;
preg_match($rgx, $txt, $arr);

// DISPLAY THE TITLE
echo
'<strong>'
. $arr[1]
. '</strong>'
. PHP_EOL
. PHP_EOL
;

// SHOW THE PAGE SOURCE
$src = htmlentities($htm);
echo $src;

?>
2个回答

2

问题不在于meta refresh标签(顺便说一下,它永远不会被CURLOPT_FOLLOWLOCATION选项跟随),而是HTTP用户代理头。网站会将HTTP用户代理头字段与接受的用户代理列表进行比对。您可以通过在设置$ch选项时添加以下行来解决此问题:

curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");

我知道这是一个老问题,但在我的情况下,safe_mode = Off,open_basedir未设置并且我添加了用户代理。 但是,FOLLOWLOCATION仍然不起作用。 我看到服务器按预期发送了正确的Location标头,但curl没有通过“Location:”递归重定向。 有什么想法吗? - Sagi Mann

1

Meta 刷新是浏览器的指令。Curl 不处理这些指令。CURLOPT_FOLLOWLOCATION 用于跟随重定向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接