CodeIgniter隐藏帖子ID和只有slug URL

时间:2013-10-13 18:43:32

标签: codeigniter url blogs

我正在开发基于CodeIgniter的自定义博客。在我获得网址时遇到了一些问题:

/博客/视图/ 1 /我的-非常先交

我不满意我想摆脱身份和“/ view”

这就是我的控制器的样子:

  function index($postId=null)
        {
            $this->view($postId=null);
        }


        function view($postId, $str_slug = '')
        {
                $data['title'] = ucfirst("Blog");
                $data['post'] = $this->posts->get_posts($postId);
                if($postId !== null)
                {
                        $this->load->view('templates/head', $data);
                        $this->load->view('templates/header', $data);
                        $this->load->view('posts/single_view', $data);
                        $this->load->view('templates/footer',$data);         
                } else {
                        $this->load->view('templates/head', $data);
                        $this->load->view('templates/header', $data);
                        $this->load->view('posts/index', $data);
                        $this->load->view('templates/footer',$data);
                }

                $row = $this->db->get_where('posts', array('id' => $postId))->row();

                if ($row and ! $str_slug) {

                    $str_slug = url_title($row->title, 'dash', TRUE);
                    redirect("blog/view/{$postId}/{$str_slug}");

                }               
        }

实现这一目标的最佳方法是什么?

谢谢! 亚当

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找 _remap()方法。您可以在此处详细了解:http://ellislab.com/codeigniter/user-guide/general/controllers.html#remapping

您的代码如下所示。如果仍然需要,仍然需要实现get_posts_by_slug()方法。

public function _remap($slug) {
    $data['title'] = ucfirst("Blog");
    $data['post'] = $this->posts->get_posts_by_slug($slug);

    if($slug !== null)
    {
            $this->load->view('templates/head', $data);
            $this->load->view('templates/header', $data);
            $this->load->view('posts/single_view', $data);
            $this->load->view('templates/footer',$data);         
    } else {
            $this->load->view('templates/head', $data);
            $this->load->view('templates/header', $data);
            $this->load->view('posts/index', $data);
            $this->load->view('templates/footer',$data);
    }

    $row = $this->db->get_where('posts', array('slug' => $slug))->row();
}

<强>更新: 嘿@AdamLesniak - 通常很好的设计来存储博客文章或新闻文章的固定链接,因此它不依赖于标题或任何其他易变数据结构,以便仍然可访问。

但对于不同的方法,我个人认为这是一个很好的系统:

http://localhost/blog/my-news-article-title-permalink/3

主要问题是,如果你没有把slu / /永久链接存放在某个地方,那么当有人改变一篇文章的标题时,你会感到难过。例如,我的文章名为“Hello World First Blog Post”,可从以下网址访问:

http://localhost/blog/hello-world-first-blog-post

更改为“我做过的第一篇文章”:

http://localhost/blog/first-post-i-ever-made

那么初始网址会发生什么?它不再可访问 - 通过搜索引擎访问网站的任何用户,或通过某人的链接,现在都不会再看到您的评论,而是会获得404页面,您希望避免这样做。

使用永久链接的一个问题是你需要确保它们是唯一的,并且需要为此设置额外的约束。

你可以做一些技巧,但他们都有陷阱。例如,您可以使用我上面提到的系统,您可以在URL的末尾粘贴唯一标识符:

http://localhost/blog/hello-world/3

如果标题发生变化,您并不在意,因为您没有使用slug进行搜索,而是依赖于唯一标识符。

http://localhost/blog/first-post-i-ever-made/3

但是我看到这种系统反对URL(统一资源定位器)的观点。我刚开始时就把它用在了后面,它被证明是一个灵活的系统;至少可以尝试一下。

BBC通过保留文章所属的类别和条目的唯一标识符来做上述变体:

http://www.bbc.co.uk/news/business-24511283

基本上,他们知道文章永远不会改变其类别,虽然它可能会更改其标题,因此他们只保留一般主题,即业务和唯一标识符 24511283 < /强>

最后,我建议你做什么,因为到目前为止,最具扩展性的解决方案是生成以下格式:

http://localhost/blog/permalink/unique-id

上面的格式让您拥有唯一的标识符,这对于保证奇点非常重要,并且所有搜索引擎友好的永久链接都是永久的!现在,如果文章标题发生变化,请在页面上向用户显示更新后的标题,但不要对永久链接执行任何操作,以免您的网址发生变化。

通过在网址中使用ID,您确定可以多次使用永久链接,系统仍然可以正确缩放。

答案 1 :(得分:1)

我写了一篇关于这个的教程,可能会有所帮助,也可能没有帮助:http://www.rappasoft.com/tutorials/14-seo-friendly-links-with-codeigniter.html