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

まず、投稿データはリダイレクト時に保持されません。2 つのリクエストを行う必要はありません。ただ固執する

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

さらにデバッグするために、次のこともお勧めします。2 つのリクエストを行った場合でも、同じ 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 に答える