我试图找出如何重定向到一个新的页面(不同的应用,控制器,动作),并维持当前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)到/ APP 2 /例如具有相同的POST数据。 也许事情是这样?
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
而不是浏览器重定向到新的位置,为什么不转发从控制器到另一个控制器的要求?
return $this->_forward("action", "controller", "module");
IMO你不能做POST重定向。 见http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3
前面已经说了,你可以保存你的调整后数据的会话。
您可以使用一个控制器_request对象
$this->_request->setPost(array(
'someKey' => 'someValue'
));
然后只需使用_forward保护方法
$this->_forward('yourAction', 'yourController', 'yourModule');
然后,在转发控制器动作只需要调用
$aPost = $this->_request->getPost();
您可以使用重定向动作助手:
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')
)
);
因为客户端处理服务器的响应后,重定向我不认为你可以做这件事。 火狐例如问他/她是否想POST数据重新发送到新的位置或没有用户。
一个讨厌的解决办法是,以填补,并返回包含了JavaScript的HTML表单和自动提交。 :/
我不是太熟悉与Zend具体,但也有我会带您的问题,两种方法:
- 针对该请求的生命会话存储POST数据/重定向
- 设置重定向是一个POST,并且对数据进行编码。 而不是使用重定向,只需发送一个新的标头,POST,而不是GET。