登录后如何重定向到以前的URL

时间:2010-01-20 12:20:58

标签: zend-framework

我想在登录操作之后进行重定向到以前的URL。请告诉我怎么做?

3 个答案:

答案 0 :(得分:2)

在登录会话之前存储页面,登录后,从会话中读取上一页网址并将使用重定向到该页面。

答案 1 :(得分:1)

您可以将“return”URL作为参数传递给登录页面。即http://yourserver.com/login/?return=http%3a%2f%2fyourserver.com%2fsomedir%2fsomething%2f。成功登录后,您可以使用get参数重定向,方法是使用简单的HTTP标头location:http://yourserver.com/somedir/something/

例如,这是在不同的Google和Microsoft服务中实施的,其中有一个用于登录的页面和需要用户被插入的不同服务。

答案 2 :(得分:1)

你可能会使用我前一段时间写过的Action助手。干杯!

class Your_Controller_Action_Helper_GoBack
 extends Zend_Controller_Action_Helper_Abstract
 {
  /**
  * @todo Check if redirecting to the same domain
  * @param bool $required Throw exception?
  * @param bool $validateDomain
  * @param bool $allowSubdomain
  * @param string $alternative URL to redirect to when validation fails and required = true
  * @param string $anchorParam Request parameter name which holds anchor name (#). Redirect to page fragment is not allowed according to HTTP protocol specification, but browsers do support it
  * @throws Zend_Controller_Action_Exception if no referer is specified and $required == false or $checkdomain is true and domains do not match
  */
  public function direct($required = true, $anchorParam = null, $validateDomain = true, $allowSubdomain = false, $alternative = null)
  {
   $front = Zend_Controller_Front::getInstance();
   $request = $front->getRequest();

   $referer = $request->getPost('http_referer');

   if (empty($referer)) {
    $referer = $request->getServer('HTTP_REFERER');
    if (empty($referer)) {

     $referer = $request->getParam('http_referer');

    }
   }

   if (null === $alternative) {
    $alternative = $request->getPost('http_referer');
    if (null === $alternative) {
     $alternative = $request->getParam('http_referer');
    }
   }

   if ($referer) {

    if ($validateDomain) {
     if (!$this->validateDomain($referer, $allowSubdomain)) {
      $this->_exception($alternative);
     }
    }

    if (null != $anchorParam) {
     $referer .= '#' . $request->getParam($anchorParam);
    }

    $redirector = new Zend_Controller_Action_Helper_Redirector();
    $redirector->gotoUrl($referer);
   } elseif($required) {
    $this->_exception($alternative);
   }
  }

  /**
   * @throws Zend_Controller_Action_Exception With specified message
   * @param string $message Exception message
   * @param string $alternative
   */
  private function _exception($alternative = null, $message = 'HTTP_REFERER is required.')
  {
   if ($alternative) {
    if (Zend_Uri::check($alternative)) {
     $redirector = new Zend_Controller_Action_Helper_Redirector();
     $redirector->gotoUrl($alternative);
    }
   }

   throw new Zend_Controller_Action_Exception($message);
  }


  /**
  * Check if domain from current url and domain from specified url are the same
  * @param string $url Target url
  * @param string $allowSubdomain false
  */
  public function validateDomain($url, $allowSubdomain = false)
  {
   if (!Zend_Uri::check($url)) {

    return false;
   }

   $currentUri = $this->getCurrentUri();

   $uri = Zend_Uri_Http::fromString($currentUri);
   $currentDomain = $uri->getHost();

   $uri = Zend_Uri_Http::fromString($url);
   $target = $uri->getHost();

   if ($allowSubdomain) {
    // Find second dot from the end
    $pos = strrpos($target, '.');

    if (false !== $pos) {
     $pos = strrpos(substr($target, 0, $pos), '.');

     if (false !== $pos) {
      $target = substr($target, $pos+1);
     }
    }
   }

   if ($target === $currentDomain) {
    return true;
   }

   return false;
  }

  /**
  * @return string Current URL
  */
  public function getCurrentUri()
  {
   $request = $this->getRequest();
   $path = $request->getRequestUri();

   $server = $request->getServer();

   $host = $request->getServer('HTTP_HOST');
   $protocol = $request->getServer('SERVER_PROTOCOL');

   if (!empty($protocol)) {
    $protocol = explode('/', $protocol);
    $protocol = strtolower($protocol[0]);
   }

   if (empty($protocol)) {
    $protocol = 'http';
   }

   $baseUrl = $protocol . '://' . $host . '/';

   $path = trim($path, '/\\');

   $url = $baseUrl . $path;

   return $url;
  }

  /**
   * Like str_replace, but only once
   * @param string $search
   * @param string $replace
   * @param string $subject
   */
  public function replaceOnce($search, $replace, $subject)
  {
   $firstChar = strpos($subject, $search);
   if($firstChar !== false) {
    $beforeStr = substr($subject, 0, $firstChar);
    $afterStr = substr($subject, $firstChar + strlen($search));

    return $beforeStr . $replace . $afterStr;
   } else {

    return $subject;
   }
  }
 }