你好。转到根以外的链接时,部分 URL 会重复。我的站点不在根目录中,而是在一个单独的文件夹中。
以下是主页地址:
http://localhost/testTaskForCodeIt/
这是我第一次进入注册页面:
http://localhost/testTaskForCodeIt/user/register(到目前为止一切顺利)
在这里我再次点击注册按钮:
http://localhost/testTaskForCodeIt/user/user/register
在这里用户部分开始被复制
.htaccess
AddDefaultCharset utf-8
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
路线文件:
return array(
'user/register' => 'user/register',
'user/login' => 'user/login',
'user/logout' => 'user/logout',
'' => 'application/index',
);
这是路由器本身:
<?php
class Router
{
private $routes;
public function __construct()
{
$routesPath = ROOT . '/config/routes.php';
$this->routes = include($routesPath);
}
/**
* Returns request string
*/
private function getURI()
{
if (!empty($_SERVER['REQUEST_URI'])) {
return trim($_SERVER['REQUEST_URI'], '/');
}
}
public function run()
{
// Получить строку запроса
$uri = $this->getURI();
// Проверить наличие такого запроса в routes.php
foreach ($this->routes as $uriPattern => $path) {
// Сравниваем $uriPattern и $uri
if (preg_match("~$uriPattern~", $uri)) {
//var_dump(strpos($uri, $uriPattern));
// Получаем внутренний путь из внешнего согласно правилу.
$internalRoute = preg_replace("~^$uriPattern~", $path, $uri);
// Определить контроллер, action, параметры
$segments = explode('/', $internalRoute);
$controllerName = array_shift($segments) . 'Controller';
$controllerName = ucfirst($controllerName);
$actionName = 'action' . ucfirst(array_shift($segments));
$parameters = $segments;
// Подключить файл класса-контроллера
$controllerFile = ROOT . '/controllers/' .
$controllerName . '.php';
if (file_exists($controllerFile)) {
include_once($controllerFile);
}
// Создать объект, вызвать метод (т.е. action)
$controllerObject = new $controllerName;
$result = call_user_func_array(array($controllerObject, $actionName), $parameters);
if ($result) {
break;
}
}
}
}
}
请告知在这种情况下可以做些什么。
好吧,这里的一切都很明显:
以一种易于理解的方式进行解释,没有前导斜杠 - 该行附加到当前行。
您需要指定完整路径:
注意前面的斜线。
我的心灵感应能力告诉我在你的代码中寻找什么:
header('Location: user/register')
在控制器代码中;<form action='user/register'>
在视图代码中。如果您不在根目录中,那么您将无法承受相对路径。您必须在任何地方只使用绝对路径。
感谢大家的建议。这是我的解决方案,以防有人需要。
路由器.php
接下来,我使用这个常量来创建一个绝对路径: