Перенаправление PHP с параметрами сообщения

У меня есть веб-страница. Эта веб-страница перенаправляет пользователя к другой веб-странице, более или менее следующий путь:

<form method="post" action="anotherpage.php" id="myform">

    <?php foreach($_GET as $key => $value){
    echo "<input type='hidden' name='{$key}' value='{$value}' />";
    } ?>

</form>
<script>

    document.getElementById('myform').submit();

</script>

Ну, Вы видите, что я делаю передает ПОЛУЧИТЬ параметрические усилители в параметрические усилители POST. Не говорите мне, что это плохо, я знаю, что сам, и это не точно, что я действительно делаю, что важно, то, что я собираю данные от массива и пытаюсь отправить его другой странице по почте. Но если пользователю выключат JavaScript, то он не будет работать. Что я должен знать: Есть ли способ передать параметры POST посредством PHP, таким образом, перенаправление может быть сделано путь PHP (header('Location: anotherpage.php');), также?

Для меня очень важно передать параметрические усилители по почте. Я не могу использовать $ _SESSION переменная, потому что веб-страница находится на другом домене, таким образом, $ _SESSION переменные отличаются.

Так или иначе мне просто нужен способ передать переменные POST с PHP ^^

Заранее спасибо!

22
задан Mic1780 15 August 2013 в 22:05
поделиться

5 ответов

Невозможно сделать это напрямую с сервера, так как данные POST должны отправляться браузером.

Но вы можете выбрать альтернативу:

  • Предварительно заполненная форма, автоматически отправленная в вашем примере, может работать, но, как вы писали, это не очень хорошая практика и может оставлять пользователей на пустой странице.
  • Получать аргументы GET и отправлять их на POST с помощью curl (или любого приличного http-клиента) на второй сайт, а затем передать результат в браузер. Это называется прокси и может быть хорошим решением imho.
  • Делайте сеанс совместного использования в домене, это не может быть возможным на всех настройках и может быть сложным. После завершения настройки совместное использование сеанса становится почти прозрачным для PHP-кода.Если у вас есть более чем одна потребность в связи между двумя доменами, это может иметь смысл.

Пример решения curl, код для запуска в домене 1:

//retrieve GET parameters as a string like arg1=0&arg1=56&argn=zz
$data = $_SERVER['QUERY_STRING']; 

// Create a curl handle to domain 2
$ch = curl_init('http://www.domain2.com/target_script.php'); 

//configure a POST request with some options
curl_setopt($ch, CURLOPT_POST, true);
//put data to send
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);    
//this option avoid retrieving HTTP response headers in answer
curl_setopt($ch, CURLOPT_HEADER, 0);
//we want to get result as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//if servers support is and you want result faster, allow compressed response
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); 

//execute request
$result = curl_exec($ch);

//show response form domain 2 to client if needed
echo $result;

Вот и все, браузер вашего клиента даже не увидит сервер домена 2, он получит только результат. знайте, хотите ли вы перенаправить клиента на домен, сделайте это с классическим заголовком http.

header('Location: http://www.domain2.com');

Конечно, это демонстрационный код с жестко запрограммированными значениями, и вам осталось 2 пункта:

  • Безопасность: строка запроса должна быть отфильтрована или воссоздана для передачи только необходимых параметров, и вы должны подтвердить сервер в домене 2 вернул код HTTP 200.
  • В этой части логика приложения не нуждается в небольшой корректировке: если приложение домена 2 ожидает получить данные публикации в том же запросе, что и посетитель, оно этого не сделает. С точки зрения домена 2 клиент, выполняющий запрос POST, будет сервером, на котором размещен домен 1, а не браузером клиента, это важно, если IP-адрес клиента имеет значение или другие проверки клиентов выполняются в домене 2. Если запрос POST служит для отображения контента, специфичного для клиента, вам также необходимо было выполнить отслеживание на стороне сервера, чтобы объединить ранее опубликованные данные с перенаправляемым посетителем.

Надеюсь, теперь это более понятно и поможет вам

12
ответ дан 29 November 2019 в 05:07
поделиться

Сохраните данные в сеансе, а затем используйте GET.

0
ответ дан 29 November 2019 в 05:07
поделиться

Это возможно. В этой ситуации я бы использовал cURL:

$url = 'http://domain.com/get-post.php';


foreach($_GET as $key=>$value) { 
  $fields_string .= $key.'='.$value.'&'; 
}
rtrim($fields_string,'&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);
0
ответ дан 29 November 2019 в 05:07
поделиться

Нет. Вы не можете сделать перенаправление заголовка с помощью POST. У вас есть 2 варианта,

  1. Вы можете использовать GET вместо этого, если место назначения принимает либо POST, либо GET.
  2. Мы добавляем кнопку в редких случаях, когда Javascript отключен.

Вот пример,

<noscript>
<div>
<input type="submit" value="Continue"/>
</div>
</noscript>

Это покажет кнопку продолжения, если Javascript выключен, чтобы пользователь мог нажать на нее для продолжения.

0
ответ дан 29 November 2019 в 05:07
поделиться

Это можно сделать с помощью php cUrl lib.

Проверьте это http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html

Спасибо, Сураб

1
ответ дан 29 November 2019 в 05:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: