好吧,我认为一切都是笨拙的,直到我想缩短一些我认为是小菜一碟的 URL。
我开发了自己的 MVC 结构,其中所有页面都通过 index.php 并根据 url 动态加载相关控制器和模型。这给了我漂亮和干净的 url,并且随着应用程序变得越来越大,它更容易开发。
所以在我的 Htaccess 文件中,我有以下内容:
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
在我的 index.php 中,我计算了 url 的长度并加载到所需的控制器等中......
$length = count($url);
if($length > 5)
{
$this->Error->index();
return FALSE;
}
switch ($length)
{
case 5:
$controller_name->{$url[1]}($url[2], $url[3], $url[4]);
break;
case 4:
$controller_name->{$url[1]}($url[2], $url[3]);
break;
case 3:
$controller_name->{$url[1]}($url[2]);
break;
case 2:
$controller_name->{$url[1]}();
break;
default:
$controller_name->index();
break;
}
这一切都很好,所以这是我的问题,我有一个网址 www.thepage.com/accounts/general_users/profile/[account_name]
所以我想通过删除'accounts/general_users/'来缩短这个网址,我在我的 htaccess 中厌倦了以下内容:
RewriteRule ^profile/april.lee$ accounts/general_users/profile/april.lee [QSA,L]
但这似乎不想与我的初始 RewriteRule 配合得很好,如果它位于第一个 RewriteRule 之下它只是不呈现,如果它高于它似乎会破坏应用程序。
我很困惑该怎么做,并希望得到一点指导/建议。我真的很想提出一个解决方案,而不必重新设计整个应用程序。
更新以演示我如何加载我的控制器和模型:
1-我获取并清理 URL:
// Get Clean URL
$url = isset($_GET['url']) ? $_GET['url'] : NULL;
$url = rtrim($url, '/');
$url = filter_var($url, FILTER_SANITIZE_URL);
$url = explode('/', $url);
// Start Session
session_start();
// Create Application Core
require_once(APP_PATH . "core/core.php");
$AC = new Application_Core($config);
2-检查它是否为空
if(empty($url[0]))
{
// Load and Instantiate Model
require(APP_PATH."models/m_index.php");
$this->Model = new m_index();
// Load and Instantiate Controller
require(APP_PATH."controllers/index.php");
$controller = new index();
$controller->index();
}
else
{
// Load and Instantiate Model
$model_file = APP_PATH."models/m_".$url[0].".php";
if(file_exists($model_file))
{
include($model_file);
$model_name = "m_".$url[0];
$this->Model = new $model_name();
}
else
{
echo $url[0];
$this->Template->render_error($this->error_page, $this->error_message);
return FALSE;
}
// Load and Instantiate Controller
$controller_file = APP_PATH."controllers/".$url[0].".php";
if(file_exists($controller_file))
{
require(APP_PATH."controllers/".$url[0].".php");
$controller_name = $url[0];
$controller_name = new $controller_name();
}
else
{
$this->Template->render_error($this->error_page, $this->error_message);
return FALSE;
}
$length = count($url);
// Check Method Exists
if ($length > 1) {
if (!method_exists($controller_name, $url[1])) {
$this->Template->render_error($this->error_page, $this->error_message);
return FALSE;
}
}
if($length > 5)
{
$this->Error->index();
return FALSE;
}
switch ($length)
{
case 5:
$controller_name->{$url[1]}($url[2], $url[3], $url[4]);
break;
case 4:
$controller_name->{$url[1]}($url[2], $url[3]);
break;
case 3:
$controller_name->{$url[1]}($url[2]);
break;
case 2:
$controller_name->{$url[1]}();
break;
default:
$controller_name->index();
break;
}
3 - 检查长度并加载适当的控制器和模型,如果方法不存在,用户将被重定向到错误页面。