Перенаправление HTTP POST

Итак, в API моего веб-приложения у меня есть входящий HTTP-запрос. Я хотел бы передать этот запрос POST на другой сервер, не теряя данные в заголовке POST. Это возможно? какой тип перенаправления я бы использовал? Примеры php?

Изменить: HTTP-запрос поступает из мобильного приложения, а не из веб-браузера.

Благодаря!

Вы можете использовать cURL или сокеты для повторной публикации данных, но вы не можете перенаправить его.

POST'ing для URL с cURL:

$ch = curl_init('http://www.somewhere.com/that/receives/postdata.php'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST)); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); 
 RewriteRule current-page.php http://www.newserver.com/newpage.php [NC,P] 

P там (прокси) сохранит данные POST. Вам нужно будет включить прокси-модуль apache, если он еще не установлен.

Я знаю, что это старый вопрос, но это может помочь людям, которые спотыкаются на этот вопрос. Вы должны иметь возможность отправить код ответа HTTP 307, чтобы заставить агента пользователя перенаправлять новый URL-адрес и продолжать использовать тот же метод и данные. Этот ответ содержит более подробную информацию

Если HTTP-библиотека клиента (т. Е. Мобильное приложение) поддерживает это, вы можете вернуть HTTP 307 с сервера, который заявляет, что «запрос должен быть повторен с другим URI … с тем же методом». Это по существу временное перенаправление, но говорит клиенту использовать тот же метод, POST.

Клиент, выполняющий запрос, должен иметь возможность отвечать на ответ HTTP 307 и следовать переадресации с помощью того же метода – для многих библиотек это может быть дополнительный флаг или параметр.

Вы не можете сообщить браузеру, чтобы он отправлял запрос через HTTP-заголовок. Заголовок location будет перенаправлен, но только для запросов GET или HEAD.

Вы можете обойти это ограничение, показывая страницу со скрытой формой с атрибутом метода, установленным в POST, и действие, установленное на URL-адрес, на который вы хотите отправить браузер, затем автоматически отправьте его на загрузку страницы. Пример:

 <body onload="document.getElementById('form').submit();"> <form id="form" action="http://example.com/form_handler.php" method="POST"> <input type="hidden" name="param_1" value="data"> </form> </body> 

Кроме того, вы можете сделать запрос POST на своем сервере, а затем отобразить результаты.

Я использовал следующий код для перенаправления сообщения. В моем случае я использую только тип содержимого приложения / октета-потока, поэтому обязательно учтите это.

 $request = file_get_contents ( "php://input" ); $arrContextOptions=array( "http" => array( "method" => "POST", "header" => 'Content-Type: application/octet-stream'. "\r\n". 'Content-Length: ' . strlen($request) . "\r\n", "content" => $request, ), "ssl"=>array( "allow_self_signed"=>true, "verify_peer"=>false, ), ); $arrContextOptions = stream_context_create($arrContextOptions); header ( "HTTP/1.1" ); header ( "Content-Type: application/octet-stream" ); $result = file_get_contents('http://thenewaddress.yes.it.works', false, $arrContextOptions); file_put_contents("php://output", $result); 

Я думаю, что решение, с которым я собираюсь пойти, это что-то вроде:

 <? $url = 'http://myserver.com/file.php'; foreach ($_POST as $key => $value) { $text .= (strlen($text) > 0 ? '&' : ''); $text .= $key . '=' . $value; } header('Location: ' . $url . '?' . $text); exit; ?> 

Может ли кто-нибудь подумать о причине, почему это плохая идея?

Если вы хотите взять данные из запроса POST и просто отправить POST на другой сервер, используйте cURL .

–или–

Если вы хотите взять данные из запроса POST и перенаправить клиента на этот другой сервер, а POSTing данных, используйте этот метод …

Динамически формировать форму со всеми данными POST. Что-то нравится это …

 echo "<form name=\"someform\" action=\"http://www.somewhereelse.com/someform.whatever\">"; foreach ($_POST as $key=>$value) { echo "<input type=\"hidden=\" name=\"" . htmlspecialchars($key) . "\" value=\"" . htmlspecialchars($value) . "\" />"; } echo "</form>"; 

Затем отправьте эту форму с помощью JavaScript, когда страница будет загружена. Загрузка …

 document.forms['someform'].submit();