使用Codeigniter进行PHP路由(SEO中的标题)

时间:2012-06-12 17:12:56

标签: php codeigniter routing

我在使用Codeigniter时遇到了一些问题。我现在正在做的是:

$route['articles/(:num)'] = 'articles/view/$1'; // $1 will contain an ID

这意味着example.com/articles/123将完美运行并加载ID为123的文章。但我也希望能够将URL的标题添加到URL(用于SEO)。示例:example.com/articles/123/article-title

我想要的东西与Stack Overflow几乎相同:stackoverflow.com/questions/123/the-title

我该怎么做?

我也想知道Stack Overflow是如何工作的。如果我转到stackoverflow / questions / 111,标题将自动添加到网址中。这是用php redirect()完成的吗?

3 个答案:

答案 0 :(得分:5)

我过去做过类似的事情;我找不到它,但IIRC(它是几个月前)你可以使用像你一样的路线,并添加一个更具体的路线,如

$route['articles/(:num)/(:any)'] = 'articles/view/$1/$2';
$route['articles/(:num)'] = 'articles/view/$1';

正如您所看到的,两者都映射到相同的方法,这种方法有点“过载”;您可以使用默认值来弥补缺少的参数:

function articles($id,$slug = FALSE) 
{ }

并简单地忽略文章检索中的第二个参数。

至于添加标题,你可以:

  1. 在数据库中有一个“slug”字段,在保存文章时创建。你可以使用舒适的url_title($title,'dash',TRUE)函数(在url帮助器中),它使用$title,使用dash作为分隔符,并使其全部小写;
  2. 使用上述功能并将文章标题(在您从数据库中检索后)转换为“即时”;如果第二个参数不是false,你只需检查article()方法,你就会知道是否需要创建slug;
  3. 至于如何在没有它的情况下使用url时如何显示slug你可以按照你猜测的那样进行重定向,但由于两条路径都指向相同的方法,所以不会为你改变任何东西。

    哦,嗯,在调用重定向时要小心循环,仔细检查;)

答案 1 :(得分:0)

我建议你在你的表中创建一个slug字段,并用你想用作id的url来完成它。 让我解释一下。

你有这张表

id
title
slug

当您将文章保存到数据库中时,您可以动态创建一个slug,例如:

id: 1
title: My first post
slug: 1-my-first-post

然后您可以使用该页面的slug(在本例中为1-my-first-post)广告ID,您可以调用它:

www.example.com/articles/1-my-first-post

显然你需要在db slect中处理它

答案 2 :(得分:0)

正如我们在评论中所讨论的那样。

您可以多次创建一个路径,每个路径都有不同的参数,例如:

$route['articles/(:num)/(:any)']
$route['articles/(:num)']

我会创建一个带有重定向的函数,添加或不添加标题。

希望它有所帮助。