3

我在 Windows 上创建了一个自定义 php MVC,它运行良好,没有任何错误,但在 linux 上我面临一些错误,比如我无法访问除默认控制器之外的任何其他控制器。

例如:localhost/mymvc - 这个 url 将我重定向到我的默认控制器

但是当我尝试打开任何其他控制器时,例如:localhost/mymvc/projects 我收到“404 未找到错误”

这是我的重定向功能:

/* ***** Getting URL ***** */
$url = isset($_GET['url']) ? $_GET['url'] : null;
$url = explode('/',$url);

/* ***** When URL does not contain any controller name call default controller ***** */
if(empty($url[0])){
    $defaultpage = HOME;
    require 'application/controllers/'.$defaultpage.'.php';
    $controller = new $defaultpage();
    $controller->loadModel($defaultpage);
    $controller->index();
    return false;
}

/* ***** When URL contains controller name ***** */
$page = 'application/controllers/'.$url['0'].'.php';
if(file_exists($page)){
    require $page;
}else{
    $this->error();
}
$controller = new $url[0];
$controller->loadModel($url[0]);

我确信这里没有错误,但仍然希望你们审查。我认为 .htaccess 文件有问题,所以这就是我的内容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
4

1 回答 1

0

理解你的 htaccess

重写引擎将被启用:
RewriteEngine On

重写的基本目录将是/:
RewriteBase /

如果请求匹配一个不存在的文件,继续:
RewriteCond %{REQUEST_FILENAME} !-f

如果请求匹配一个不存在的目录,继续:
RewriteCond %{REQUEST_FILENAME} !-d

如果请求匹配一个不存在的符号链接,继续:
RewriteCond %{REQUEST_FILENAME} !-l

Rewrite to index.php:
// L 表示如果规则匹配,则不再处理该规则以下的 RewriteRules。
// QSA 将来自原始请求 URL 的任何查询字符串附加到在重写目标中创建的任何查询字符串
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

正如我们所见,您的 htaccess 没有实际问题。现在您需要检查您的 apache 中是否启用了 mod_rewrite。

您可以只输出 phpinfo() 并检查它是否已启用。

现在进入你的 PHP。

首先一定要记住linux是区分大小写的。

调试:

在这条线之后

$page = 'application/controllers/'.$url['0'].'.php';

添加这个 var_dump

var_dump($page);

检查路径是否正确,然后进行其余的调试分析!

问候

于 2013-12-26T12:59:40.637 回答