2016-02-12 76 views
2

我有一個腳本,發送POST數據到幾個頁面。但是,我遇到了一些困難,向某些服務器發送請求。原因是重定向。這裏的模型:PHP與捲曲:遵循重定向與POST

  1. 我'發送POST請求到服務器
  2. 服務器響應:301永久移動
  3. 然後curl_setopt($ CH,CURLOPT_FOLLOWLOCATION,TRUE)踢和後面的重定向(但可通過GET請求)。

爲了解決這個問題,我使用了curl_setopt($ ch,CURLOPT_CUSTOMREQUEST,「POST」)和yes,現在它的重定向沒有發送第一個請求中的POST主體內容。如何在重定向時強制curl 發送帖子主體?謝謝!

這裏的例子:

<?php 
function curlPost($url, $postData = "") 
{ 
    $ch = curl_init() or exit ("curl error: Can't init curl"); 
    $url = trim ($url); 
    curl_setopt ($ch, CURLOPT_URL, $url); 
    //curl_setopt ($ch, CURLOPT_POST, 1); 
    curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $postData); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 30); 
    curl_setopt ($ch, CURLOPT_TIMEOUT, 30); 
    curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36"); 
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, TRUE); 

    $response = curl_exec ($ch); 
    if (! $response) { 
     echo "Curl errno: " . curl_errno ($ch) . " (" . $url . " postdata = $postData)\n"; 
     echo "Curl error: " . curl_error ($ch) . " (" . $url . " postdata = $postData)\n"; 
     $info = curl_getinfo($ch); 
     echo "HTTP code: ".$info["http_code"]."\n"; 
     // exit(); 
    } 
    curl_close ($ch); 
    // echo $response; 
    return $response; 
} 
?> 
+0

一個307響應代碼把你的PHP代碼後與例如 –

回答

7

捲曲下面什麼RFC 7231 suggests,這也就是通常的瀏覽器301級的響應做:

Note: For historical reasons, a user agent MAY change the request 
    method from POST to GET for the subsequent request. If this 
    behavior is undesired, the 307 (Temporary Redirect) status code 
    can be used instead. 

如果你認爲這是不可取的,你可以改變它CURLOPT_POSTREDIR選項,這在PHP中似乎非常稀少,但是the libcurl docs explains it。通過在那裏設置正確的位掩碼,您可以在重定向後執行curl 而不是更改方法。

如果你控制了該服務器端,更容易的解決將是確保返回而不是301

+0

哇,謝謝。沒有在網上找到任何關於此事的信息。此外,PHP說:「注意:使用未定義的常量CURL_REDIR_POST_ALL」,所以沒有這個常量defind,我只是使用curl_setopt($ ch,CURLOPT_POSTREDIR,3)。它現在很好用。再次感謝你的不錯! –