2

我在维护会话 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);

有谁知道上面的代码有什么问题,或者是否有另一种方法来完成任务?

4

1 回答 1

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 和请求序列。您正在尝试模拟真实的请求,因此深入研究您的浏览器发出的请求会很有帮助。

于 2012-11-21T19:47:55.060 回答