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 数据将 (302) 重定向到 /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

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-Data 保存在会话中。

于 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 将重定向并在下一页上填充凭据,但不提交第二个表单。

$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 不太熟悉,但有两种方法可以解决您的问题:

  1. 在该请求/重定向的整个生命周期中将 POST 数据存储在会话中
  2. 将重定向设置为 POST,并对数据进行编码。而不是使用重定向,只需使用 POST 而不是 GET 发送一个新标头。
于 2009-08-21T00:17:02.873 回答