18

新しいページ (別のアプリケーション、コントローラー、アクション) にリダイレクトし、現在の 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であれば、同じ POST データで /app2/example にリダイレクト (302) します。もしかしてこういうこと?

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

4

6 に答える 6

16

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

return $this->_forward("action", "controller", "module");
于 2009-08-21T00:11:29.783 に答える
13

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

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

于 2009-08-21T09:17:50.387 に答える
7

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

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

そして、単に _forward 保護されたメソッドを使用します

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

次に、転送されたコントローラーアクションで呼び出すだけです

$aPost = $this->_request->getPost();
于 2013-03-06T18:09:09.900 に答える
2

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

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')
        )
   );
于 2013-10-22T16:39:58.297 に答える
0

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

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

于 2009-08-21T00:02:26.353 に答える
0

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

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