我正在试图弄清楚如何重定向到新页面(不同的应用程序,控制器,操作)并维护当前的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
答案 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)
您可以使用重定向器操作助手:
这对我有用。它将登录凭据从一个登录屏幕传递到另一个登录屏幕。 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,但我会对你的问题采取两种方法: