对于这些情况,我想自动重定向回我发出请求的页面:
另一种情况(不是'重定向到上一页'):
我已经在网上搜索了这个并发现了some solutions,但它们并不符合 Zend Framework 2 。我希望所有这些都以zf2方式完成。
感谢您的帮助!
答案 0 :(得分:21)
这对我有用:
$url = $this->getRequest()->getHeader('Referer')->getUri();
$this->redirect()->toUrl($url);
答案 1 :(得分:12)
好吧,对于CRUD的东西,我只是简单地重定向到上一个动作的路线,通常是admin-index
,administrate
等等。在这种情况下,我真的不明白为什么你需要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\ZfcUser和bjyoungblood\BjyAuthorize。对于这些示例中的每一个,我都链接了相关的代码示例,这些示例可能会根据您的需求提供一些见解。
答案 2 :(得分:2)
我认为referer字段仅在您点击链接时设置,并让您自己被重定向到应得的页面。以http://www.whatismyreferer.com/为例。 当你google它并点击链接,这将带你到这个网站,referer将是谷歌。但是,如果您将此URL复制并粘贴到Web浏览器,则将不会定义referer页面。我错了吗?
答案 3 :(得分: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');
}
}
答案 4 :(得分:0)
上面的内容更适合我,但是这个:
$url = $this->getRequest()->getHeaders('cookie')->original_url;
$this->redirect()->toUrl($url);
[我很感激,如果有人让我知道,为什么“引用方式”对我不起作用! :)谢谢!]
答案 5 :(得分: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');