我在 Windows 上创建了一个自定义的 php MVC,它运行良好,没有任何错误,但在 Linux 上,我遇到了一些错误,比如我无法访问除我的默认 Controller 之外的任何其他 Controller 。
例如:localhost/mymvc
- 这个 url 将我重定向到我的默认 Controller
但是当我尝试打开任何其他 Controller 时,例如:localhost/mymvc/projects
我收到“404 not found error”
这是我的重定向函数:
/* ***** 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]
最佳答案
了解您的 htaccess
将启用重写引擎:
RewriteEngine 开启
重写的基本目录将是/:
RewriteBase/
如果请求匹配一个不存在的文件,继续:
RewriteCond %{REQUEST_FILENAME} !-f
如果请求匹配一个不存在的目录,继续:
RewriteCond %{REQUEST_FILENAME} !-d
如果请求匹配一个不存在的符号链接(symbolic link),继续:
RewriteCond %{REQUEST_FILENAME} !-l
重写为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);
检查路径是否正确,然后进行其余的调试分析!
问候
关于php - linux 上的 htaccess 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14034622/