web-dev-qa-db-ja.com

POSTデータをPHPリダイレクトで送信することは可能ですか?

更新:これは の複製ではありませんPOST PHPでリクエストを送信するにはどうすればよいですか? 。そこにある解決策は私にはうまくいきません、彼らはリクエストの結果を出力するだけです、私はこれをしたくありません、私はユーザーを外部サイトに送りたいです、それはクレジットカード支払い処理のための安全なウェブサイトです。

更新2:私がやろうとしていることを明確に説明するために、以下の図を追加しました

これが私がやろうとしていることです:

  1. htmlフォームがphpスクリプトに送信されます

  2. phpスクリプトはデータに対して何らかの処理を行い、POSTリクエストを介して外部のWebサイトにデータを送信します

  3. POSTリクエストの結果をPHPスクリプトで受け取りたくないのですが、代わりに、ユーザーを外部サイトに送りたいだけです。 POSTの結果

リクエストの結果を受け取ることに興味がないので、curlはこのタスクには適していないと思います。ユーザーがフォームを直接送信したかのように、ユーザーを次のサイトに送りたいだけです。

別の言い方をすれば、フォームを外部のWebサイトに送信したいのですが、最初に独自のスクリプトに送信して、データを処理して電子メール通知を送信してから、新しい計算データを使用して外部のWebサイトに送信します。追加されました。

これを行うことを考える1つの方法は、新しいフォーム出力をjavascriptとともに非表示フィールドとして出力してフォームを自動送信することですが、javascriptに依存せずにそれを行うためのより簡単で堅牢な方法が必要です。ヘッダーを操作することによって、または単に投稿リクエストを送信して結果にリダイレクトするphp関数がすでに存在するのでしょうか?

What I'm trying to do

11
AidanCurran

短編小説:いいえ、PHPを使用することはできません。

これを行うことを考えることができる1つの方法は、フォームを自動送信するためにjavascriptとともに非表示フィールドとして新しいフォーム出力を出力することです...

それを行う唯一の方法です。


問題は、 PHP Redirect with POST data


自殺の解決策 として、 HTTP 307-一時的なリダイレクト の使用を検討できます。
上記のリンク先のHTTP/1.1ドキュメントから:

GETまたはHEAD以外のリクエストに応答して307ステータスコードを受信した場合、ユーザーエージェントは、ユーザーが確認できない限り、リクエストを自動的にリダイレクトしてはなりません、これにより、リクエストが発行された条件が変わる可能性があるためです。

私の太字は、ユーザーの確認なしのリダイレクトは、実際にはブラウザのプロトコルの実装に依存することを強調しています。

リダイレクトは、次のように[〜#〜] post [〜#〜]リクエストを受信するPHPスクリプトで実装できます*:

header('HTTP/1.1 307 Temporary Redirect');
header('Location: <your page in an external site>');

基本的な使用例:

page1.html-フォームを含むページ

<html>
  <body>
    <form method="POST" action="page2.php">
      <input name="variable1" />
      <input name="variable2" />
      <input type="submit" />
    </form>
  </body>
</html>

page2.php-リダイレクト前にPOSTデータを処理するページ

<?php

if (isset($_POST['variable1']) && isset($_POST['variable2'])) {

  //do your processing stuff

  header('HTTP/1.1 307 Temporary Redirect');
  header('Location: page3.php');

  exit;
} else
    echo 'variable1 and variable2 are not set';

page3.phpPOSTデータのリダイレクト先のページ(つまり、外部サイト

<?php

if (isset($_POST['variable1']) && isset($_POST['variable2'])) {

    foreach ($_POST as $key=>$val)
        echo $key . ' = ' . $val . '<br>';

} else
    echo 'variable1 and variable2 are not set';

家でこれを試さないでください!

10
fantaghirocco

POSTデータを送信しながら1つのページから別のページにリダイレクトしようとしているようです。PHPでは不可能だと思います。

私が考えることができる最も簡単な回避策は、cURLを使用して(1)$_POSTデータを別のサーバーに転送し、(2)そのサーバーから結果を受信し、(3)別のページに簡単にリダイレクトすることです。合計3つのHTTPリクエストが必要ですが(このような単純な問題の場合は少し多くなります)、達成しようとしていることを多かれ少なかれ達成します。


このアプローチを、質問で述べた3つのステップに分解しましょう。

step 1の場合、値が「post」の「method」属性がある限り、どのHTMLフォームでもかまいません。 JavaScriptを使用せずにフォームを送信する場合は、「送信」ボタンがあることを確認してください。これにより、送信ボタンが押されたときに、フォームの「アクション」属性で定義されたページにデータが送信されます。

HTMLの例:

<form action="action_page.php" method="post">
    First name:<br />
    <input type="text" name="firstname" value="Mickey"><br />

    Last name:<br />
    <input type="text" name="lastname" value="Mouse" /><br /><br />

    <input type="submit" value="Submit" />
</form>

step 2の場合、フォームの「action」属性の値と同じ名前のページを作成する必要があります。この例の場合、それはaction_page.phpになります。ここでは、$_POSTに送信したフォームフィールドの値が含まれているかどうかを確認します。ケースまたは私たちの例では、次のようにすることができます:

if (isset($_POST['firstname']) && isset($_POST['lastname'])) {
    // Do the stuff you want to do on your own server here!
} else {
    // Do nothing here!
}

ステップの場合、HTMLフォームから受け取った$_POSTデータを使用して、2番目のPOSTリクエストを行う必要があります。最も簡単な方法これを行うには、cURLを使用します。次に、2番目のPOSTリクエストの出力に応じて、ユーザーを2番目のページにリダイレクトします。

サンプルコードの可読性を向上させるために、cURL-requestに関連するすべてのコードを関数に入れました。

function forwardRequest($url, $data) {
    $result = [
        'status' => NULL,
        'last_url' => NULL,
        'response' => NULL
    ];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $result['response'] = curl_exec($ch);
    $result['status'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $result['last_url'] = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
    curl_close ($ch);
    return $result;
}

if (isset($_POST['firstname']) && isset($_POST['lastname'])) {
    // Do the stuff you want to do on your own server here!

    $result = forwardRequest("http://www.example.com/processdata.php", $_POST);

    if ($result['status'] === 200) {
        header('Location: http://www.example.com/ok.php');
    } else {
        header('Location: http://www.example.com/error.php');
    }
} else {
    header('Location: http://www.example.com/youshouldnotbehere.php');
}

注1:

外部システムにデータが送信されるたびに、そのシステムですべてがうまくいくかどうかを判断する一般的な方法はないのではないかと思います。

私のサンプルコードでは、cURLリクエストによって受信された応答の HTTPステータスコード を使用しています。このソリューションは、サーバーで問題が発生した場合にサーバーが200に等しくないステータスコードを返す場合にのみ機能します。このアプローチがユースケースに十分であるかどうかを確認するには、いくつかのテストを実行する必要があります。

ステータスコードを使用してすべてがうまくいったかどうかを判断できない場合は、最後の有効なURLを確認するか、応答ヘッダーと応答テキストで手がかりを探すことを検討してください。


注2:

CURLリクエストが処理された後にユーザーを転送する代わりに、サーバーからユーザーに応答テキストを表示したい場合があります。この結果に不要なジャンクがたくさん含まれている場合は、DOMDocument::loadHTMLまたはサードパーティライブラリ( Masterminds/html5-php など)を使用して結果を解析することを検討してください。 PHPPowertools/DOM-Query )。

独自のカスタム応答テキストを作成することもできます。

7
John Slegers

実装方法に応じて、99%または100%のいずれかで機能するソリューションが1つあります。あなたがする必要があるのはAJAXでフォームを処理することです。これを行うJavascriptのない方法が必要なことは知っていますが、これが最も簡単な方法です。 jQueryライブラリを使用する場合、ドキュメントとSOの回答は非常に簡単で、多くのコードを記述する必要はありません。いくつかを変更するだけです。概念は次のとおりです。

1)支払い処理ウェブサイトを指すフォームアクションで、ページが通常どおり読み込まれます。 Javascript(jQuery)を使用してフォームを送信しているので、送信ボタンのhtmlを次のように置き換えます。

<input type="button" value="Check Out" onclick="NameofAjaxFunctionHere();"

2)フォームのアクション値を交換します。処理されるバックグラウンドでフォームを送信する実際のAJAXコードの前に、このコードに類似したものを使用して、アクションを独自のPHPページに変更します。 :

 $('#formIdHere').attr('action', 'yourPHPpageAndPathHere.php');

このコードはjQuery用ですが、必要に応じてプレーンJavaScriptに簡単に変更できるはずです。また、AJAXコードがフォームをリセットしないことを確認してください。多くのコピーおよび過去のコードは、親切にこれを行います。

3)(オプション)この段階で、フォームはPHPページに送信され、必要な処理が完了しました。2つのオプションがあります。

  • 応答を待たずに、4番に進んでください。
  • 応答を待ち、それに応じて対応し、必要に応じてデータを変更します

データが正しいことを確認する必要がある場合、またはデータの一部を変更する必要がある場合は、今すぐ実行してください。フォームデータがプロセスに失敗した場合(たとえば、変更されたデータ)、FALSEを返送し、番号4に進みます。変更が必要な場合は、単純なプロセスです。配列で更新が必要なすべてのデータを送り返し、このプロセスを開始したのと同じAJAXコードでループします。Javascriptを使用して、フォームの値を変更できます。

[Code missing because I think you can figure this out if you need to do that. If not comment and when I have time I will post an example]

4)フォームアクションをスワップバックします。 AJAX処理が完了しました。従来は、フォームがワイプされてメッセージが表示されます。上記のオプションを選択すると、データが不良な場合に送信を停止するためにFALSEが送信されます。 AJAXスクリプトになりました(フォームが送信されなかったことを示す、そのリターンの前に何かを表示する可能性があります)。

 $('#formIdHere').attr('action', 'paymentUrlHere');

支払いURLが元の場所に戻り、そのルートに進む必要がある場合はデータが更新されたので、通常どおりにフォームを送信します。 jQueryでは、これは次のように単純にすることができます。

 $('#formIdHere').submit();

そして、私はそれをカバーしていると思います。この時点で、ユーザーはあなたの手の届かないところにあり、通常のPOSTで支払い処理Webサイトに送信されました。必要に応じて、フォームのデータを変更する機会もありました。

OH PS-これが、この投稿の冒頭で99%と100%の方法について私が意味したことです。 100%は私がここであなたに与えた例です。自分のPHPページを最初に作成せずにフォームを送信することはできません。99%の解決策は、次のようにページ内の通常の送信htmlです。

<input type="submit" ...>

次に、Javascriptを使用して、デフォルトの送信アクションを停止し、手順1〜4に従います。そうすれば、誰かがjavascriptを無効にした場合(またはそれをブロックするデバイス上にある場合)、フォームは少なくとも支払い処理業者に送信します。あなたがやりたいことはあなた次第です。

4
Blizzardengle

フォーム送信時にのみ値を投稿できます

action = "path/filename.php";

このフォームでは、フォームの値を投稿できます。

その時点でファイルをリダイレクトしたい場合は、URLを介して値を渡すことができます

header('Location: url/filename.php?param1=      ');

投稿するローカルファイルの値に対してこれを試してください。

最初にフォームから値を割り当てる必要があり、次に変数を使用してヘッダーを再配置します。それは私の側からの正しい解決策かもしれません。ありがとうございました。

3
Sathish Kumar D

短い答え :

  • 外部サーバーへのPOST
  • 応答を解析する
  • 何もエコーしないでください
  • ヘッダーを使用( '場所:url?param = res');
  • 出口 ; //これはちょっと重要です

POSTリクエストの結果をPHPスクリプトで受け取りたくないのですが、代わりに、ユーザーを外部サイトに送りたいだけです。 POSTの結果

POST a PHPスクリプトからのリクエストを送信している場合、応答は常に同じPHPスクリプト。必要なのは、これをユーザーに返送するのではなく、ユーザーを別のURLにリダイレクトすることだと思います。

header('Location: url?param=res') ;
exit ;

header()呼び出しの前にクライアントに何も送信しません

3
gyaani_guy

PHPを使用することはできません。

しかし、あなたはこの微調整を使うことができます、http://example.com/script.phpであなたはいくつかのjavascriptautoを書くことができますチェックサムを使用してコードを送信します。例えば。

<body onload="document.frm1.submit()">   
<form method="POST" action="https://gatewaysite.com" name="frm1">
  <input name="checksum" value="yourchecksumvalue" />
  <input name="variable2" />
</form>
</body>
2
Malay M

あなたはあなたの説明に優れた計画を持っています。フォーマット後にページ2で編集されたデータを含む3ページへの 新しいPOST リクエストを生成しないのはなぜですか?新しいPOST requst with Chrome extension Postman

1
Oleg Sapishchuk

それは不可能です。ページが完全に読み込まれるため、必要なときにこのcreate Sessionsを使用する代わりに、POSTリクエストで空のデータが表示される可能性があります。そのセッションを使用した後は、セッションを破棄するだけです。 。そして2つ目はCURLの使用法です。

1
Nallapu Nagesh

あなたが両方のウェブサイトの所有者である場合は、各.htacessファイルにサイトを含めるだけで、暗号化されたままになります。

このための資格は、両方のサイトのSSLCAです。

.htaccessで、これを行うには、次のようにします。これは、サイト#1のhtaccessに追加されます。

     RewriteCond %{HTTP_REFERER} !^https://www.site2.com/.*$      [NC]
     RewriteCond %{HTTP_REFERER} !^https://www.site2.com$      [NC]

これはサイト#2のhtaccessに追加されました:

     RewriteCond %{HTTP_REFERER} !^https://www.site1.com/.*$      [NC]
     RewriteCond %{HTTP_REFERER} !^https://www.site1.com$      [NC]

次に、サイト#1で次のような標準のhtmlフォームを使用できます。

       <form action="https://wwww.site2.com" method="POST">
0
drtechno