繁体   English   中英

用于数据库的Codeigniter .htaccess重写

[英]Codeigniter .htaccess rewriting for database

我在Codeigniter遇到困难。 我试图通过传递记录ID作为URL的一部分从MySQL数据中获取数据

该网址是

本地主机/ site_folder / page / page_title / 2

在上面的URL中, page是控制器的名称, 2是数据库中记录的主要ID(可以是1到9999之间的任何数字)。

我的控制器包括:

public function index()
{
    $this->load->helper('url');
    $this->load->model('pages_model');

    $id = $this->uri->segment(3,1);
    if (empty($id))
    {
        show_404();
    }

    $data['page'] = $this->pages_model->get_page($id);
    $this->load->view('page',$data);
}

我的.htaccess包含这个

    RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L] 

当我在地址栏中输入localhost/site_folder/page/page_title/2 ,它会抛出404。
但是,当我输入localhost/site_folder/page它会显示默认的数据库条目,如上面segment(3,1)的第二个值所示。

因此,如何更改.htaccess文件以进行可行的重写?
我尝试了以下方法,但没有一个对我有用:

  • RewriteRule。*页面/ $ 0 [PT,L]
  • RewriteRule。*页面/(*.)/$0 [PT,L]
  • RewriteRule。*页面/(?*.)/$ [PT,L]

您可以尝试使用CI文档https://ellislab.com/codeigniter/user-guide/general/controllers.html中所述的_remap函数。

_remap函数(如果存在于控制器中)是在任何类方法之前调用的函数,在此函数中,您可以检查发送到该函数的参数,并根据此调用检查控制器的任何方法。

对于您的示例,因为我假设page_title是动态的,您可以设置一个正则表达式来对其进行检查,或者如以下示例中所述,检查该方法是否不存在,然后将其视为页面标题(这意味着您必须确保可以在此控制器中不是页面标题和方法名称)

public function _remap($method, $params = array())
{
    if (!method_exists($this, $method))
    {   
        // assume this is a page_title and run the index method

        $this->index($method, $params);     
    }
    else {
        // means that method exists then run that method
        $this->$method( $params);
    }

}

还请记住,这意味着当有人只是键入控制器将其视为page_title的随机字符串时,您应该考虑404标头的索引方法用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM