8

对于这些情况,我想自动重定向回我发出请求的页面:

  1. 完成任何操作(CRUD 等)后 - 我认为我们需要重定向到“HTTP_REFERER”
  2. 在冲浪或购物时,如果需要登录,则在完成身份验证过程后,它应该重定向回同一页面

另一种情况(不是“重定向到上一页”):

  • 在查询中传递一个重定向 URL(登陆页面地址),例如:如果我发送一个(外部)/URL(ofc 编码)作为 GET 查询参数(或路由部分),登录后,它应该将我重定向到这个 URL

我已经在网上搜索过这个并找到了一些解决方案,但它们不是根据Zend Framework 2的。我希望所有这些都以 zf2 方式完成。

谢谢你的帮助!

4

6 回答 6

22

这对我有用:

$url = $this->getRequest()->getHeader('Referer')->getUri();
$this->redirect()->toUrl($url);
于 2013-02-13T15:08:09.720 回答
13

好吧,对于 CRUD 的东西,我会简单地重定向到前一个动作的路线,通常是类似的admin-indexadministrate或者其他什么。我真的不明白为什么HTTP_REFERER在这种情况下你会需要。但是,如果您仍然想访问HTTP_REFERER它,就像这样简单:

//SomeController.php
$redirectUrl = $this->getRequest()->getHeader('HTTP_REFERER', $defaultValue);

有关更多信息,请参阅Zend\Http\Request

重定向将redirect()使用Zend\Mvc\Controller\AbstractActionController

$this->redirect()->toUrl($redirectUrl); //or using a route:
$this->redirect()->toRoute('some/route');

要查看更多用例的实时示例,我建议您查看一些非常适合您的用例的模块。这里最合适的可能是Zf-Commons\ZfcUserbjyoungblood\BjyAuthorize。对于这些示例中的每一个,我都链接了相关的代码示例,这些示例可能会深入了解您的需求。

于 2013-01-13T13:10:09.513 回答
2

我认为仅在您单击链接并让自己被重定向到应得的页面时才设置引用字段。以http://www.whatismyreferer.com/为例。当您使用谷歌搜索并单击链接时,该链接会将您带到该站点,引用者将是谷歌。但是,如果您将此 url 复制并粘贴到您的网络浏览器,则引用页面将是未定义的。我错了吗?

于 2014-02-27T13:20:53.183 回答
1

这是一个很酷的技巧。

首先创建一个特征:

<?php

namespace Application\Controller\Plugin;

use Zend\Session;

trait RefererRedirect
{
    /**
     * @var Session\Container
     */
    private $sessionContainer;

    /**
     * @param Session\Container $sessionContainer
     */
    public function setSessionContainer(Session\Container $sessionContainer)
    {
        $this->sessionContainer = $sessionContainer;
    }

    protected function clearReferer()
    {
        $this->sessionContainer->offsetUnset('referer');
    }

    protected function registerReferer()
    {
        if (!$this->sessionContainer->offsetExists('referer')) {
            $this->sessionContainer->offsetSet('referer', $this->getRequest()->getHeader('Referer')->uri()->getPath());
        }
    }

    protected function redirectToRefererOrDefaultRoute($defaultRoute, $defaultParams = [])
    {
        if ($this->sessionContainer->offsetExists('referer')) {
            $url = $this->sessionContainer->offsetGet('referer');
            $this->clearReferer();

            return $this->redirect()->toUrl($url);
        }

        return $this->redirect()->toRoute($defaultRoute, $defaultParams);
    }
}

然后是一个界面:

<?php

namespace Application;

use Zend\Session;

interface RefererAwareInterface
{
    /**
     * @param Session\Container $sessionContainer
     */
    public function setSessionContainer(Session\Container $sessionContainer);
}

然后使用接口注入SessionContainer:

<?php

namespace Application;

class Module
{
    public function getControllerConfig()
    {
        return [
            'factories' => [
            ],
            'initializers' => array(
                function ($instance, $sm) {
                    if ($instance instanceof RefererAwareInterface) {
                        $instance->setSessionContainer(new Session\Container('Referer'));
                    }
                }
            )
        ];
    }
}

然后在你的控制器中:

<?php

namespace Auth\Controller;

class UsersController extends AbstractActionController implements RefererAwareInterface
{
    use RefererRedirect;

    public function indexAction()
    {
        $this->clearReferer();

        // do stuff
    }

    public function addAction()
    {
        $this->registerReferer();

        // do stuff

        return $this->redirectToRefererOrDefaultRoute('auth/users');
    }

    public function backAction()
    {
        return $this->redirectToRefererOrDefaultRoute('auth/users');
    }
}
于 2016-07-28T13:51:17.290 回答
0

上面的一个对我有用,但是这个:

$url = $this->getRequest()->getHeaders('cookie')->original_url;
$this->redirect()->toUrl($url);

[不过,如果有人澄清了我,我会很感激,为什么“推荐人方式”对我不起作用!:) 谢谢!]

于 2013-09-28T20:42:29.387 回答
0

只是想从我的最终代码中分享一个片段,如果用户来自另一个页面:

$referer = $this->getRequest()->getHeader('Referer');
if ($referer) {
    $refererUrl = $referer->uri()->getPath(); // referer url
    $refererHost = $referer->uri()->getHost(); // referer host
    $host = $this->getRequest()->getUri()->getHost(); // current host

    // only redirect to previous page if request comes from same host
    if ($refererUrl && ($refererHost == $host)) {
        return $this->redirect()->toUrl($refererUrl);
    }
}
// redirect to home if no referer or from another page
return $this->redirect()->toRoute('home');
于 2015-01-28T13:23:42.153 回答