目录中的CakePHP应用程序会破坏使用查询字符串完成的重定向

时间:2012-01-09 20:01:03

标签: php cakephp

我的 CakePHP 2.0 应用程序网址为:http://localhost/testapplication/

当我从链接登录时重定向时,我使用查询字符串,例如

localhost/testapplication/login?continue=/testapplication/admin/posts

重定向使用:

完成
            if(isset($this->params['url']['continue']))
            {
                $pathtoredirect = $this->params['url']['continue'];
            }
            else
            {
                $pathtoredirect = $this->Auth->redirect();
            }

            return $this->redirect($pathtoredirect);

然而,当我进行重定向时,我将最终得到一个URL:

localhost/testapplication/testapplication/admin/posts

正如您所看到的那样,它会重定向到传递的url,但因为传递的url还包含基本目录,所以它会复制它,从而破坏url重定向并最终达到404!

有关如何解决此问题的任何想法?

只是为了确认:

  • url确实以/开头,所以它确实在根级别重定向,但问题是根级别是一个目录,所以它复制它,因为它也在查询中传递

3 个答案:

答案 0 :(得分:1)

如果您通过以下任一方式构建路径:

$continue = Router::url(array('controller' => 'admin', 'action' => 'posts'));
$continue = Router::url('/admin/posts');

然后Router::url将添加基本路径/application。然后,如果您再次在生成的网址上调用Router::url(或redirect,则Router::url将再次添加。这就是它的工作方式,你无能为力。

实际上,网址/application/admin/posts不明确,但CakePHP将其读作controller=applicationaction=admin,第一个参数为posts

唯一可以避免这种情况的方法是:

使用绝对网址:

$continue = Router::url(array('controller' => 'admin', 'action' => 'posts'), true);

或确保Router::url仅被调用一次,例如:

$continue = '/admin/posts';

或登录后

$pathtoredirect = FULL_BASE_URL . $this->params['url']['continue'];

答案 1 :(得分:0)

好像你有几个选择。如果$this->params['url']['continue']正是您使用查询字符串传递的内容,您是否可以修改查询字符串,使其仅为/admin/posts,因此完整的网址将为application/admin/posts

您可能不必这样做,但我需要确切地看到$this->params['url']['continue']的样子。请在重定向之前在某处die(debug($this->params['url']['continue']));进行操作,以便我们进一步调查。

答案 2 :(得分:0)

好的解决方法是执行以下操作:

使用帮助程序获取完整的URL(如其他人所述):

class LinkHelper extends AppHelper
{
    public function selfURL()
    {
        $pageURL = 'http';

        //if ($_SERVER["HTTPS"] == "on")
        if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
        {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80")
        {
            $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        } 
        else
        {
            $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }

        $pageURL = urlencode($pageURL);

        return $pageURL;  
    }

}

然后在使用URL时确保对它们进行编码和解码以便在地址栏中使用

e.g。 $pathtoredirect = urldecode($this->params['url']['continue']);