web-dev-qa-db-ja.com

/ POST data(PHP / Zend)を使用して新しいページにリダイレクトする

新しいページ(別のアプリケーション、コントローラー、アクション)にリダイレクトし、現在のPOSTデータを維持する方法を見つけようとしています。

私のアプリはPOSTデータを検証しており、特定の基準が満たされた場合、別の場所にリダイレクトしたいのですが、POSTデータがPOSTデータとしてその新しい場所に渡されることを確認してくださいページ。大まかな例を次に示します。

_POST /app1/example HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
    var1=foo&var2=bar
_

exampleAction(Zend_Controller_Action)で、_var1 == foo_かどうかを確認し、リダイレクトする場合は(302)同じPOSTデータを使用して/ app2/exampleにリダイレクトします。たぶんこのようなもの?

_HTTP/1.x 302 Found
Location: /app2/example
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
    var1=foo&var2=bar
_

Zend_Http_Clientを使用して新しいHTTPリクエストを作成する方法はわかりますが、単にページをリクエストしてコンテンツを表示することは考えていません。とにかくZend_Http_Clientの使用を引き続き検討する必要がありますか?現時点では、次のようなもので遊んでいます。

_$this->getResponse()->setRedirect('/app2/example/', 302);
$this->getResponse()->setBody(http_build_query($this->_request->getPost()));
_

私がやりたいことは、なんらかの策略と悪魔の呪いによって可能になると確信していますが、それは間違いなく私をほのめかしています。どんな助けでも大歓迎です。

-rk

17
angrychimp

ブラウザを新しい場所にリダイレクトするのではなく、コントローラから他のコントローラにリクエストを転送してみませんか?

return $this->_forward("action", "controller", "module");
16
gnarf

IMOでは、POSTでリダイレクトを行うことはできません。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10. を参照してください。

すでに述べたように、POSTデータをセッションに保存できます。

13
Benjamin Cremer

Controller_requestオブジェクトを使用できます

$this->_request->setPost(array(
    'someKey' => 'someValue'
));

そして、単に_forwardprotectedメソッドを使用します

$this->_forward('yourAction', 'yourController', 'yourModule');

次に、転送されたコントローラーアクションで、

$aPost = $this->_request->getPost();
6

リダイレクタアクションヘルパーを使用できます。

http://framework.zend.com/manual/1.12/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.redirector

これは私のために働いています。あるログイン画面から別のログイン画面にログイン資格情報を渡します。 307により、ブラウザはリダイレクトが発生していることをユーザーに警告する場合があります。303はリダイレクトして次のページに資格情報を入力しますが、2番目のフォームは送信しません。

$baseUrl = 'https://example.com';
$this->_redirector = $this->_helper->getHelper('Redirector');
$this->_redirector->setCode(307)
   ->setUseAbsoluteUri(true)
   ->gotoUrl($baseUrl . '/home/login',
        array('username' => $authForm->getValue('username'),
              'password' => $authForm->getValue('password')
        )
   );
2
user2182349

クライアントはサーバーの応答後にリダイレクトを処理するため、これについてはあまりできないと思います。たとえばFirefoxは、ユーザーにPOSTデータを新しい場所に再送信するかどうかを尋ねます。

厄介な解決策は、HTMLフォームに入力して返送し、JavaScriptで自動送信することです。 :/

0
Philippe Gerber

私は特にZendに精通していませんが、あなたの問題に対して私が取る2つのアプローチがあります。

  1. POSTデータをそのリクエスト/リダイレクトの存続期間中、セッションに保存します
  2. リダイレクトをPOSTに設定し、データをエンコードします。リダイレクトを使用する代わりに、GETの代わりにPOSTを使用して新しいヘッダーを送信するだけです。
0
cam8001