重定向到包含POST数据的新页面(PHP/Zend)

重定向到包含POST数据的新页面(PHP/Zend),php,zend-framework,redirect,http-status-code-302,Php,Zend Framework,Redirect,Http Status Code 302,我试图弄清楚如何重定向到新页面(不同的应用程序、控制器、操作)并维护当前的POST数据 我的应用程序正在验证帖子数据,如果满足特定条件,我希望重定向到其他位置,但请确保将帖子数据作为帖子数据传递到新页面。下面是一个粗略的例子: POST /app1/example HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded Content-Length: 17 var1=foo&var2=b

我试图弄清楚如何重定向到新页面(不同的应用程序、控制器、操作)并维护当前的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\u Controller\u Action)中,我检查
var1==foo
,是否确实要用相同的POST数据将(302)重定向到/app2/示例。像这样的东西

HTTP/1.x 302 Found
Location: /app2/example
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
    var1=foo&var2=bar
我可以看到如何使用Zend_HTTP_客户端创建一个新的HTTP请求,但我不想简单地请求页面并显示内容。我还是应该使用Zend_Http_客户端吗?现在我正在玩这样的东西:

$this->getResponse()->setRedirect('/app2/example/', 302);
$this->getResponse()->setBody(http_build_query($this->_request->getPost()));
我确信我想做的事情是可能的,通过一些诡计和恶魔的跳跃,但它肯定是暗指我。感谢您的帮助


-rk

因为客户端在服务器响应后处理重定向,所以我认为您对此无能为力。例如,Firefox会询问用户是否希望将POST数据重新发送到新位置


一个令人讨厌的解决方案是填写并返回HTML表单,然后用JavaScript自动提交/

与其将浏览器重定向到新位置,为什么不将请求从控制器转发到另一个控制器

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

我对Zend不太熟悉,但有两种方法可以解决您的问题:

  • 在该请求/重定向的生命周期内,将POST数据存储在会话中
  • 将重定向设置为POST,并对数据进行编码。不使用重定向,只需使用POST而不是GET发送一个新的头

  • 在我看来,你不能用POST进行重定向。看


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

    您可以使用控制器请求对象

    $this->_request->setPost(array(
        'someKey' => 'someValue'
    ));
    
    然后简单地使用_前向保护方法

    $this->_forward('yourAction', 'yourController', 'yourModule');
    
    然后,在转发控制器操作中,只需调用

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

    您可以使用重定向器操作帮助器:

    这对我有用。它将登录凭证从一个登录屏幕传递到另一个屏幕。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')
            )
       );
    

    我试过了,它似乎锁定了应用程序。我没有看到任何请求活动(使用Firefox的LiveHTTPHeaders),我的httpd线程只会增加CPU(从顶部查看)。我将在代码中添加一些日志记录,看看它是否真的陷入了无止境的循环,因为我真的希望这就是答案。首先,在调用之前使用set_time_limit(5)或类似的东西,这样php在执行5秒后会因错误而中断,您应该能够看到“循环”具有堆栈跟踪。此外,它不会发出另一个HTTP请求,调度器只会更改Zend_controller_请求中的控制器/模块/操作参数并重新修补。如果出于某种原因,其他操作正在转发,或者做了一些奇怪的事情,调用了原始操作,那么您可能会得到一个循环。好吧,这似乎正是我想要的,只是出于某种原因,我们没有正确配置模块。我们有一些古怪的设置,每个被访问的模块都被设置为默认模块,而它不知道其他模块。算了吧,谢谢你的验证,格纳夫!这并不能回答问题。当你帮助一个问你问题的人时,他后面的1000个人来到这里,发现你的答案毫无用处。请回答问题-不要告诉他们问错了问题。绝对正确。没有它,总有一种方法可以做到。这只是你糟糕的应用程序设计:P