2

我有一些关于使用 Codeigniter 进行路由的问题。我现在正在做的事情如下:

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

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

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

我怎样才能做到这一点?

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

4

3 回答 3

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 帮助程序中),该功能将$titledash用作分隔符,并将其全部设为小写;
  2. 使用上述函数并“即时”转换文章的标题(从数据库中检索后);如果第二个参数不为假,只需检查 article() 方法,您就会知道是否需要创建 slug;

至于如何在没有它的情况下使用 url 时如何显示 slug,正如您所猜测的那样,您可以进行重定向,但是由于两条路由都指向相同的方法,因此它不会为您改变任何东西。

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

于 2012-06-12T17:33:44.190 回答
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

显然你需要在你的数据库选择中处理它

于 2012-06-12T17:17:15.790 回答
0

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

您可以多次创建路线并使用不同的参数,例如:

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

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

希望能帮助到你。

于 2012-06-12T17:35:59.920 回答