OK ケーキの一部だと思っていたいくつかの 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;
}
これはすべて問題なく動作するので、これが私の問題です。URL www.thepage.com/accounts/general_users/profile/[account_name] があります。
したがって、「accounts/general_users/」を切り取ってこの URL を短縮したかったので、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 - 長さがチェックされ、適切なコントローラーとモデルが読み込まれます。メソッドが存在しない場合、ユーザーはエラー ページにリダイレクトされます。