2012-03-04 96 views
1

我正在使用以下腳本將數據發佈到外部網站。在下面的例子中,$ method,$ url和$ postdata已經被用戶收集。如何防止PHP發送的HTTP請求中的403錯誤?

foreach($postdata as $key => $value) 
{ 
    $data .= $key . '=' . $value . '&'; 
} 

if ($method == 'POST') { 

    // Set headers 
    $headers = array('http' => array(
      'method' => $method, 
      'header' => "accept-language: en\r\n" . 
      "Host: $host\r\n" . 
      "Referer: $url\r\n" . 
      "Content-Type: application/x-www-form-urlencoded\r\n", 
      'content' => $data)); 

    // Send request and retreive response 
    $context = stream_context_create($headers); 
    $fp = fopen($url, 'rb', false, $context); 
    fpassthru($fp); 
    fclose($fp); 

} else if ($method == 'GET') { 

    // Set headers 
    $headers = array('http' => array(
      'method' => $method, 
      'header' => "accept-language: en\r\n" . 
      "Host: $host\r\n" . 
      "Referer: $url\r\n" . 
      "Content-Type: application/x-www-form-urlencoded\r\n")); 

    // Append url 
    $url .= '?' . $data; 

    // Send request and retreive response 
    $context = stream_context_create($headers); 
    $fp = fopen($url, 'rb', false, $context); 
    fpassthru($fp); 
    fclose($fp); 

} else { 
    echo 'Invalid method.'; 
} 

它可以在大多數情況下正常,但是有些網站會發送回紫禁城403,表面上是因爲他們不喜歡的fopen()請求。有沒有解決的辦法?如果我使用cURL,它會阻止403?而且,如果是這樣,做上述事情的方法是什麼?謝謝。

+1

403與fopen vs cURL沒什麼關係,而是它不喜歡你的電話。這可能是由於缺乏引用者(或者它不喜歡的引用者,引用熱鏈接保護)。它也可能意味着您嘗試訪問的URL是受密碼保護的,僅僅是禁止的,或者需要特定的會話cookie。這在不同的網站之間會有所不同,所以不會有一攬子答案。話雖如此,我肯定會建議一般使用cuRL(並且不要欺騙那些不希望成爲的網站)。 – Morgon 2012-03-04 21:15:31

+0

我不認爲它是引用者,因爲我將它設置爲請求的url。這不是其他的東西。儘管如此,我會研究cURL解決方案。而我不是刮網站:) – Joey 2012-03-04 21:26:26

回答

1

您可能希望確保您將USER-AGENT和您的標題一起傳遞。我曾參與過項目,這些項目需要我們登錄到遠程系統才能獲取數據,但在其中一些系統上,如果我們沒有通過有效的用戶代理,我們將無法訪問,即使登錄憑據是正確設置。