我的 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!
有关如何解决此问题的任何想法?
只是为了确认:
/
开头,所以它确实在根级别重定向,但问题是根级别是一个目录,所以它复制它,因为它也在查询中传递答案 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=application
,action=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']);