2016-02-12 5 views
2

У меня есть сценарий, который отправляет данные POST на несколько страниц. однако я столкнулся с некоторыми трудностями при отправке запроса на некоторые серверы. Причина в перенаправлении. Вот модель:php with Curl: следует перенаправить с POST

  1. I'am отправки запроса на сервер после
  2. ответов сервера: 301 Moved Постоянно
  3. Тогда curl_setopt ($ ч, CURLOPT_FOLLOWLOCATION, TRUE) умирает и следует перенаправлению (но через GET запрос).

Чтобы решить эту i'am с помощью curl_setopt ($ ч, CURLOPT_CUSTOMREQUEST, «POST») и да, теперь его перенаправление без содержания 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

поместить свой код 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. Установив там правильную битовую маску, вы затем сделаете завиток не метод изменения, когда он следует за перенаправлением.

Если вы контролируете стороне сервера для этого, легче исправить будет убедиться, что код 307 возвращается ответ вместо 301.

+0

Вау, спасибо. Об этом не нашли ничего в сети. Кроме того, php говорит: «Обратите внимание: использование неопределенной константы CURL_REDIR_POST_ALL», поэтому этой константы нет, и я просто использовал curl_setopt ($ ch, CURLOPT_POSTREDIR, 3). Теперь он работает хорошо. Еще раз спасибо, ваше очень хорошо! –