1

好吧,我认为一切都是笨拙的,直到我想缩短一些我认为是小菜一碟的 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 - 检查长度并加载适当的控制器和模型,如果方法不存在,用户将被重定向到错误页面。

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 对搜索引擎友好且更易于人类阅读和理解。您可以通过在 url 中搜索特定特征并通过变量告诉 index.php 页面使用哪个控制函数来继续向 index.php 发送请求。






仅仅基于 URL 中的字符数量来确定页面的操作并不是一个好主意,原因有很多,包括创建一个可以轻松更改和升级的站点。

Net Tuts 也为 htaccess 提供了不错的初学者教程。

于 2013-03-23T18:01:12.240 回答