我有一些关于使用Codeigniter路由的问题。我现在正在做的是:
$route['articles/(:num)'] = 'articles/view/$1'; // $1 will contain an ID
这意味着 example.com/articles/123 将完美运行并加载 ID 为 123 的文章。但我也希望有可能将 aticle 的标题添加到 URL(用于 SEO)。示例:example.com/articles/123/article-title
我想要的与堆栈溢出几乎相同:stackoverflow.com/questions/123/the-title
我该怎么做?
我也想知道堆栈溢出是如何工作的。如果我转到stackoverflow/questions/111,标题将自动添加到URL中。这是用php redirect()完成的吗?
我过去做过类似的事情;我找不到它知道,但是IIRC(几个月前)您可以像以前一样使用路线,也可以添加更具体的路线,例如
$route['articles/(:num)/(:any)'] = 'articles/view/$1/$2';
$route['articles/(:num)'] = 'articles/view/$1';
如您所见,两者都映射到相同的方法,这是一种"重载";您可以使用默认值来弥补缺少的参数:
function articles($id,$slug = FALSE)
{ }
并简单地忽略文章检索中的第二个参数。
至于添加标题,您可以:
- 在您的数据库中有一个"slug"字段,该字段是在保存文章时创建的。您可以使用舒适的
url_title($title,'dash',TRUE)
函数(在 url 帮助器中),该函数采用$title
,使用dash
作为分隔符,并将其全部小写; - 使用上面的函数并"即时"转换文章的标题(从数据库中检索后); 只需检查 article() 方法,如果第二个参数不为 false,您就会知道是否需要创建 slug;
至于如何在没有它的 url 的情况下显示 slug,正如您所猜测的那样,您可以进行重定向,但由于两条路由都指向相同的方法,因此它不会为您更改任何内容。
哦,嗯,调用重定向时要小心循环,仔细检查;)
我建议您在表中创建一个 slug 字段,并使用要用作 id 的 url 完成它。让我解释一下。
你有这个表
id
title
slug
当您将文章保存到数据库中时,您可以动态地创建一个 slug,例如:
id: 1
title: My first post
slug: 1-my-first-post
然后,您可以为网页使用 slug(在本例中为 1-my-first-post)AD ID,您可以将其称为:
www.example.com/articles/1-my-first-post
显然,您需要在数据库中处理它
正如我们在评论中讨论的那样。
您可以多次创建路径,每个路由使用不同的参数,例如:
$route['articles/(:num)/(:any)']
$route['articles/(:num)']
我会创建一个带有重定向的函数,添加或不添加标题。
希望对您有所帮助。