使用/ POST数据重定向到新页面(PHP / Zend)

时间:2009-08-20 23:53:08

标签: php zend-framework redirect http-status-code-302

我正在试图弄清楚如何重定向到新页面(不同的应用程序,控制器,操作)并维护当前的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

6 个答案:

答案 0 :(得分:17)

为什么不将控制器的请求转发给其他控制器,而不是将浏览器重定向到新位置?

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

答案 1 :(得分:13)

IMO你不能用POST进行重定向。见http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3

如前所述,您可以在会话中保存POST数据。

答案 2 :(得分:6)

您可以使用Controller _request对象

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

然后只需使用_forward protected method

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

然后,在转发的控制器操作中,只需调用

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

答案 3 :(得分: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')
        )
   );

答案 4 :(得分:0)

因为客户端在服务器的响应之后处理重定向,所以我认为你不能对此做很多事情。例如,Firefox询问用户是否要将POST数据重新发送到新位置。

一个讨厌的解决方案是填写并返回一个HTML表单并使用JavaScript自动提交它。 :/

答案 5 :(得分:0)

我并不特别熟悉Zend,但我会对你的问题采取两种方法:

  1. 将POST数据存储在会话中,直至该请求/重定向
  2. 将重定向设置为POST,并对数据进行编码。而不是使用重定向,只需使用POST而不是GET发送新标头。