什么是Slug?

67

我正在学习 CodeIgniter 绝妙的文档中的教程。但是有一个术语经常被使用,那就是 "slug"。我已经四处查找了很多关于这个词的含义,但是仍然无法理解它是什么以及它是用来做什么的。以下是一个使用它的例子:

使用这段代码,您可以执行两个不同的查询。您可以获取所有新闻记录,或者通过它的 slug 获取一个新闻项目。


不确定在CI中是否有更多的含义,但一般来说:http://en.wikipedia.org/wiki/Slug_(web_publishing)#Slug - dev-null-dweller
那么以下代码如何关联:public function get_news($slug = FALSE) { if ($slug === FALSE) { $query = $this->db->get('news'); return $query->result_array(); } $query = $this->db->get_where('news', array('slug' => $slug)); return $query->row_array(); } - mzyrc
看起来它会返回与给定slug相对应的新闻。就像按id查找一样,但您提供唯一的slug代替数字id。 - dev-null-dweller
唯一的“slug”是什么?像一个关键词吗? - mzyrc
5个回答

122

“Slug”是在访问资源时URL的一部分。比如你有一个URL像下面这样,显示你系统中的所有汽车:

http://localhost/cars

当您想在系统中引用特定的汽车时,您将提供以下URL:

http://localhost/cars/audi-a6/

注意URL仍然非常合乎逻辑,并且非常有利于SEO。至于使用slug,那就取决于您自己了。上面的audi-a6字符串可以是您系统中汽车的唯一标识符——假设您有一个关系型数据库,其中包含以下字段:

id
car_name
car_brand
car_unique_identifier

使用字段car_unique_identifier来存储在slug中显示的值;例如,在我上面指定奥迪A6汽车的示例中,你的audi-a6字符串将存储在此处。

你也可以以其他方式使用它 - 例如,如果你有一个类似于博客的posts控制器。页面标题可能是slug,如果它是URL编码的话。对于我们的文章标题为“提高SEO的最佳方法”,你可以提供以下URL:

http://localhosts/posts/best-ways-to-make-seo-better

您需要对slug运行url_decode(),然后您将获得字符串best ways to make seo better,您可以使用它来通过标题找到帖子。

这并不需要停止——您可以决定有多个slug来表示某些内容——让我们看看BBC如何做到这一点。我从今天的随机文章中选了一篇,它的URL如下:

http://www.bbc.co.uk/news/world-africa-24506006

这是一个链接,指向一篇名为《非洲联盟敦促国际刑事法院放弃对领导人的指控》的文章。BBC的做法是使用slug的最后部分world-africa-24506006,也就是24506006来在他们的系统中唯一标识一个条目。他们很可能使用world-africa来表示一个帖子所属的类别(虽然这只是一个假设,但它仍然是一个有根据的猜测)。

最后,让我们想象一下以下用于研究论文的数据库表格。

id
category
title
你可能有一个像下面这样工作的例子。
http://localhost/papers

这个URL代表了系统中当前的所有研究论文。您可以通过以下slug访问所有物理学研究论文:

http://localhost/papers/physics

我们的Slug是物理,我们的数据库选择目前看起来像这样:

SELECT *
FROM papers
WHERE LOWER(papers.category) = 'physics'

接下来您可以公开以下网址:

http://localhost/papers/physics/gravitation

现在,我们的 slug 由物理引力组成。我们背后的查询可能看起来像这样:

SELECT *
FROM papers
WHERE LOWER(papers.category) = 'physics'
AND LOWER(papers.title) = 'gravitation'

这使我们能够在系统中唯一地标识一个条目。

因此,我们已经反复使用 slug 来过滤我们的信息。在这个例子中,当我们没有使用任何 slug 运行 URL 时:

http://localhost/papers

我们希望列出所有可用的研究论文。当我们使用 physics Slug 运行 URL 时:

http://localhost/papers/physics

我们希望列出所有关于物理学的研究论文,从而缩小结果范围。最后,当我们提供了两个标识符时,我们就可以在系统中唯一地确定一个条目。

http://localhost/papers/physics/gravitation

我们可以用不同的方式进行建模吗?当然可以!根据我们系统的需求,我们可以对关系表进行规范化和反规范化。我们可以设置一个永久链接系统,这样我们的帖子表将如下所示:

 id
 title
 permalink

那么,我们可能会有以下条目:

 | 20013 | Gravitation | physics-gravitation-breakthrough |

因此暴露了URL:

 http://localhost/papers/physics-gravitation-breakthrough
在上面的示例中,短链接 physics-gravitation-breakthrough 允许我们通过以下方式唯一地识别一篇文章:
 SELECT *
 FROM papers
 WHERE papers.permalink = physics-gravitation-breakthrough

有没有可能我可以像这样更改URL:http://localhost/audi-a6/,我不想在URL中包括父级。 - rahim.nagori

98

简短回答

它是此问题URL中的what-is-a-slug部分。


1
Short and creative! :) - Jaladh Singhal

11

“slug”是一个与上下文有关的词汇,但在编程中或者就本问题而言,“slug”指的是URL。我们知道URL不能包含所有字符。因此,当任何文章、页面、控制器使用标题时,它们的slug被用作URL。这可能是自动派生的。

所以,总的来说,slug是任何名称的URL友好版本


4
下面是一个slug的示例:
 <?php
 function create_slug($string){
  $slug=preg_replace('/[^A-Za-z0-9-]+/', '-', $string);
  return $slug;
   }
  echo create_slug('does this thing work or not');
   //returns 'does-this-thing-work-or-not'
  ?>

0
所有以上给出的答案都是正确的,但我想直接回答这个问题。 在Codeigniter教程示例中,Slug指的是URL“news”。如果您的$slug或数据库中没有“news”,并且在浏览器中运行此URL“index.php/news/view”,将返回错误404页面未找到。 我遇到了这个问题,直到我阅读了上面的答案,才明白Slug的含义。 我在数据库表中将我的slug更改为news。 Slug就像一个指针。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接