我在PHP中使用基于MVC的CMS并使用自定义处理路由的方式与MVC应用程序的结构方式相对应但是我经常遇到路由配置找到控制器或视图时发生的重定向循环问题那不存在。下面是我的App类,它处理控制器及其视图的路由和输出。
class App
{
protected $controller = '';
protected $_controller = '';
protected $redir_controller = '';
protected $viewMethod = '';
protected $params = [];
public function __construct()
{
$url = $this->parseUrl();
//print_r($url);
if(!file_exists(strtolower('app/controllers/'.$url[0].'.php')) && $url[0] != 'home')
{
header("Location: ".SITE_ROOT()."home/");
}
else
{
$this->controller = $url[0];
$this->_controller = $url[0];
unset($url[0]);
//$this->controller = 'home';
}
$this->controller = new $this->controller;
if(isset($url[1]) && !empty($url[1]))
{
if(method_exists($this->controller, $url[1]))
{
$this->viewMethod = $url[1];
unset($url[1]);
}
else
{
//echo $this->_controller;
header("Location: ".SITE_ROOT()."".$this->_controller."/index//");
//unset($url[1]);
}
}
else
{
header("Location: ".SITE_ROOT()."".$this->_controller."/index//");
}
$this->params = $url ? array_values($url) : [];
call_user_func_array([$this->controller, $this->viewMethod], $this->params);
}
public function parseUrl()
{
if(isset($_GET['url']))
{
return $url = explode('/', rtrim($_GET['url'], '/'));
}
}
}
你可以看到它是如何工作的,但我不明白这是如何发生的。它会输出我的SITE_ROOT,当前设置为
<?php
define('SITE_ROOT', 'http://dsykes.koding.io/sc/sykescms/');
?>
然后根据url追加控制器和视图。但是对于某些原因,如果视图不存在,则输出http://dsykes.koding.io/sc/sykescms/home/hoome/home/home/home/home等等......
这是我的.htaccess文件,它也允许这种类型的网址设置。
Options -MultiViews
RewriteEngine On
RewriteBase /sc/sykescms/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
有什么想法可以解决这个问题吗?