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


PHP routing with Codeigniter (Titles in URL for SEO)

我有一些关于使用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) 
{ }

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

至于添加标题,您可以:

  1. 在您的数据库中有一个"slug"字段,该字段是在保存文章时创建的。您可以使用舒适的url_title($title,'dash',TRUE)函数(在 url 帮助器中),该函数采用$title,使用dash作为分隔符,并将其全部小写;
  2. 使用上面的函数并"即时"转换文章的标题(从数据库中检索后); 只需检查 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)']

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

希望对您有所帮助。