【问题标题】:Redirect to new page w/ POST data (PHP/Zend)使用 / POST 数据重定向到新页面 (PHP/Zend)
【发布时间】:2010-11-21 12:30:33
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      与其将浏览器重定向到新位置,不如直接将请求从控制器转发到另一个控制器?

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

      【讨论】:

      • 我试过了,它似乎锁定了应用程序。我没有看到任何请求活动(对 Firefox 使用 LiveHTTPHeaders),而且我的 httpd 线程只是使 CPU 达到峰值(从顶部看)。我将在代码中添加一些日志记录,看看它是否真的陷入了无限循环,因为我真的很希望这是答案。
      • 嗯 - 首先 - 在调用之前使用 set_time_limit(5) 或类似的东西,这样 php 会在 5 秒的执行时间后因错误而中断,你应该能够看到带有堆栈跟踪的“循环”。此外,它不会发出另一个 HTTP 请求,Dispatcher 只会更改 Zend_Controller_Request 中的控制器/模块/动作参数并重新分配。如果由于某种原因,其他操作正在转发,或者做一些奇怪的事情来回调原始操作,您可能会遇到循环。
      • 嗯,这似乎正是我想要的,除了由于某种原因我们没有正确配置我们的模块。我们有一些古怪的设置,每个访问的模块都设置为默认模块,它不知道其他模块。去搞清楚。感谢您的验证,gnarf!
      • 这没有回答问题。当你帮助了那个提问的人时,他之后的 1000 个人来到这里,发现你的答案毫无用处。请回答问题 - 不要告诉他们他们问错了问题。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        如前所述,您可以将 POST-Data 保存在 Session 中。

        【讨论】:

        • 完全正确。没有它,总有办法做到这一点。这只是你糟糕的应用设计:P
        【解决方案5】:

        您可以使用 Controller _request 对象

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

        然后简单地使用 _forward 保护方法

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

        然后,在转发控制器动作中调用

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

        【讨论】:

          【解决方案6】:

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

          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')
                  )
             );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-05
            • 2012-09-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多