另一个Htaccess问题

时间:2013-03-23 17:47:14

标签: php .htaccess

好吧我认为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 - 检查长度并加载相应的控制器和模型,如果该方法不存在,则将用户重定向到错误页面。

1 个答案:

答案 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.