好吧我认为eveything是hunky-dory,直到我想缩短一些我认为会成为Cake的URL。
我有开发我自己的MVC结构,其中所有页面都通过index.php进行,并根据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之下,它只是不呈现,如果它上面似乎打破了应用程序。
我很不知道该做什么,并且会喜欢一些指导/建议。我真的想提出一个解决方案,而不必重新整理整个应用程序。
更新以演示如何加载Controller和Model:
1-我得到并清理网址:
// 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 - 检查长度并加载相应的控制器和模型,如果该方法不存在,则将用户重定向到错误页面。
答案 0 :(得分:0)
这似乎可以通过不控制URL的长度来更好地处理。如果有人在最短链接的末尾输入额外的变量以查看会发生什么,会发生什么?他们是否会从您的网站获得针对其他用户的行为,这可能会很糟糕。
你可以使用htaccess来完成交换机所做的一切,而不用担心。
RewriteCond %{http_host} ^mysite.com/ [nc]
RewriteRule ^(.*)$ http://www.mysite.com/$1 [nc]
RewriteRule ^profile/(.*)$ accounts/general_users/profile/$1 [QSA, L]
RewriteRule ^url_for_control1/match$ index.php?controller=1&%{QUERY_STRING}
修改:
要使用index.php文件,这取决于它的作用,如果您的控制功能将用户重定向到另一个页面,您可以让htaccess为您执行此操作。
例如,以下..
RewriteCond %{http_host} ^mysite.com/ [nc]
RewriteRule ^(.*)$ http://www.mysite.com/$1 [nc]
RewriteRule ^employees/(.*)/(.*)$ index.php?first=$1&last=$2&%{QUERY_STRING}
将请求重定向到:
http://www.mysite.com/employees/john/doe
至:
http://www.mysite.com/index.php?first=john&last=doe&anyother=variables_sent
...使用GET或POST变量,具体取决于页面的请求方式。
了解这一点,您可以创建更清晰的URL,这些URL对搜索引擎友好,更易于人类阅读和理解。您可以通过在URL中搜索特定特征并通过要使用的控制函数的变量告诉index.php页面,继续向index.php发送请求。
出于多种原因,仅根据URL中的字符数确定页面操作不是一个好主意,包括使网站易于更改和升级。
Net Tuts has a decent beginners tutorial as well for htaccess.