我在维护会话Cookie和发布字段信息时遇到重定向问题。这是过程的方式:
1)访问URL,他们返回一个cookie和一个302响应(指向您刚刚访问的同一个URL)
2)使用他们提供的cookie重新访问URL,您可以看到正确的页面。
我可以通过CURLOPT_FOLLOWLOCATION = true
访问正确的页面,但是我猜CURL在跟踪重定向时没有保留帖子字段,因此页面上没有有用的内容。
我尝试过手动存储cookie,并使用存储的cookie执行“重定向”,但是使用这种方法,我永远不会超过302重定向到正确的页面。这里提到的手动方法的代码如下。
$tmp_name = tempnam('tmp', 'COOKIE');
$url = "MY_URL";
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_REFERER => $url,
CURLOPT_HEADER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => array(
'field1' => 'postfield1',
'field2' => 'postfield2',
),
CURLOPT_VERBOSE => true,
);
// Make the first request, specifying where to store the cookie
// This request returns the cookie and the 302 response
$ch = curl_init($url);
curl_setopt_array($ch, $options);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmp_name);
$resp1 = curl_exec($ch);
// Make the second request, using the cookie stored above
// Should return the proper page, but gives me the 302 again instead.
$ch = curl_init($url);
curl_setopt_array($ch, $options);
curl_setopt($ch, CURLOPT_COOKIEFILE, $tmp_name);
$resp2 = curl_exec($ch);
是否有人知道上述代码有什么问题,或者是否有其他方法可以完成任务?
答案 0 :(得分:1)
首先,发布数据永远不会保留在重定向上。所以不要担心,你不必提出两个请求。坚持
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
我还建议进一步调整以下内容:即使你提出两个请求,使用相同的curl资源,也不要关闭它来创建新的。另外,添加:
curl_setopt($ch, CURLOPT_FORBID_REUSE, 0);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 0);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "valid user agent");
您还可以使用浏览器插件(即HttpFox)来检查所需的确切cookie和请求序列。您正在尝试模拟真实的请求,因此深入了解您的浏览器所做的一切可以提供很多帮助。