8

このような状況では、リクエストを行ったページに自動リダイレクトします。

  1. アクション(CRUDなど)を終了した後-ここでは、「HTTP_REFERER」にリダイレクトする必要があると思います
  2. サーフィンやショッピング中にログインが必要な場合は、認証プロセスが終了した後、同じページにリダイレクトする必要があります

別の状況(「前のページにリダイレクト」ではありません):

  • クエリでリダイレクトURL(ランディングページアドレス)を渡します。例:ログイン後に(外部)/ URL(ofcエンコード)をGETクエリパラメータ(またはルート部分)として送信すると、このURLにリダイレクトされます。

私はすでにこれをネットで検索し、いくつかの解決策を見つけましたが、それらはZendFramework2に準拠していません。私はこれをすべてzf2の方法で実行したいと思っています。

助けてくれてありがとう!

4

6 に答える 6

22

これは私のために働いた:

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

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\ZfcUserbjyoungblood\BjyAuthorize でしょう。これらの例のそれぞれについて、ニーズに洞察を与える可能性のある関連するコード サンプルをリンクしました。

于 2013-01-13T13:10:09.513 に答える
2

リファラーフィールドは、リンクをクリックして、適切なページにリダイレクトされたときにのみ設定されると思います。たとえばhttp://www.whatismyreferer.com/。それをググってリンクをクリックすると、このサイトに移動し、リファラーはグーグルになります。ただし、この URL を Web ブラウザにコピー アンド ペーストすると、リファラー ページが未定義になります。私が間違っている?

于 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 に答える