1

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 - 長さがチェックされ、適切なコントローラーとモデルが読み込まれます。メソッドが存在しない場合、ユーザーはエラー ページにリダイレクトされます。

4

1 に答える 1

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で特定の特性を検索し、使用する制御関数を変数を介してindex.phpページに指示することにより、引き続きindex.phpにリクエストを送信できます。






簡単に変更およびアップグレードできるサイトを作成するなど、さまざまな理由から、URLの文字数のみに基づいてページのアクションを決定することはお勧めできません。

Net Tutsには、htaccess用のまともな初心者向けチュートリアルもあります。

于 2013-03-23T18:01:12.240 に答える