什么是“友好的URL”?

56

最近我在这个网站以及其他地方阅读了大量关于“友好URL”的讨论,但我不确定什么样的URL才算是“友好的”,以及为什么我们真正关心(到一定程度)。如下示例:

以下是目前绝大多数Web开发人员认为“友好”的URL示例:

www.myblog.com/posts/123/this-is-the-name-of-my-blog-post

相比之下,以下URL被认为是“不友好”的(即差劲的、尼安德特的、无知的、愚蠢的):

www.myblog.com/posts.aspx?id=123

我的问题:

  • “友好”的URL难道不包含有关所讨论博客文章的重复标识信息吗?换句话说,一旦你有了文章的ID(123),你为什么还需要文章标题呢?这不违反了“不要重复自己”的原则吗?
  • URL的形式对用户有什么影响?用户会手动键入完整的URL吗(当然除了顶级域名)?用户是否会查看页面的URL以确定页面内容?为什么我们需要在URL中包含博客文章的标题?这不是页面的标签和内容的功能吗?</li> <li>我经常听到以SEO为理由,认为“友好”的URL形式是首选。搜索引擎蜘蛛为什么会关心URL?它们不只是自动化的软件程序,爬行页面(以及其中包含的指向其他页面的链接)吗?如果搜索引擎像其他软件组件(例如数据库访问组件)一样编写,那么URL对它们来说只是一个无意义的标识符(类似于关系数据库中的rowguid)。如果我设计了一个类似“友好”的URL作为表的主键的数据库模式,我会(完全正确地)被批评的。</li> </ul>我之前说“在某种程度上”是因为显然,URL可能会失控。下面是一个来自Amazon.com的实际URL,我认为任何正常人都不会认为它是“友好”的: <blockquote> <p><a href="http://www.amazon.com/Bissell-Kitchen-Housewares/b/ref=amb_link_5001972_17?ie=UTF8&node=694500&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=gp-center-5&pf_rd_r=1ZXNJFE0CCFFDH4B9HGH&pf_rd_t=101&pf_rd_p=405478901&pf_rd_i=510080" rel="noreferrer">http://www.amazon.com/Bissell-Kitchen-Housewares/b/ref=amb_link_5001972_17?ie=UTF8&node=694500&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=gp-center-5&pf_rd_r=1ZXNJFE0CCFFDH4B9HGH&pf_rd_t=101&pf_rd_p=405478901&pf_rd_i=510080</a></p> </blockquote>

第一种形式(URL 中包含文章标题的那种)的缺点是,当编辑文章标题时会更改 URL。我经常在 Stack Overflow 上看到这种情况,因为问题被编辑过,所以我之前点击过的链接现在都显示为未点击的颜色。这很烦人。 - rmeador
2
SO使用/id/this-is-the-title形式的URL,但URL的标题部分并不真正起到作用。您可以在id部分之后使用任何字符串。也许SO使用标题使用户更容易看到他们正在查看什么,但不考虑URL的标题部分以防止链接失效。 - Aaron
19个回答

61

WWW的创始人蒂姆·伯纳斯-李(Tim Berners-Lee)十年前写了一篇关于这个主题的精彩文章

  • 你的例子是一个糟糕的URL -- 不仅因为它既有id,又有“slug”(页面标题的缩写和连字符形式)。在长期来看,在你的URL中加入页面标题是有问题的。内容随着时间的推移而变化。如果您曾经更改博客文章的标题,您将被迫选择保留旧URL还是更改URL以匹配新标题。更改URL将打破到该页面的所有先前链接;不更改意味着您将拥有与页面不匹配的URL。这对用户都不好。最好只使用 www.myblog.com/posts/123

  • 用户通常需要键入URL,但更重要的是,他们有时会编辑现有的URL以查找站点中的其他页面。因此,有可发现的URL往往是有益的。例如,如果我想查看第124篇文章,我可以轻松查看当前URL并确定我想要查看的页面的URL是www.myblog.com/posts/124。这是一种对于试图找到他们想要的内容的人来说非常有用的用户友好级别。包括其他信息(如帖子的主题)可能会使这个过程变得不可行,因此它减少了我的探索选项。

  • 忘记SEO。搜索引擎技术一直在削弱SEO技巧的有效性。良好的内容仍然是最重要的 - 从长远来看,您将无法欺骗系统。


18
在 URL 中加入主题并不意味着它会破坏,如果你只是使用物品的 ID 进行检索,那么 URL 的其余部分并不重要。 - Ryan Doherty
4
如果你使用这个“slug”方案,并且你曾经更改了页面的标题——然后更改了URL以匹配新标题——之前所有指向该页面的链接现在都会失效。或者,不要更改,那么该网址将无法匹配。在URL中加入页面标题真的没有任何面向用户的好处。 - Matt Howell
12
“忘掉SEO”?我完全不同意。好的URL不仅因为它们短而好,而是因为它们独特且与页面内容相关。这个争论完全取决于您的内容背景和典型用户。 - doekman
3
软件通常会完全忽略URL中的“slug”部分。你通常可以将其替换为任何随机文本 - 真正重要的是整数ID。 - Henrik Paul
1
除了SEO方面,一些观点是正确的...如果您使用ID查找文章,则可以更改标题(和slug),而入站链接不会受到影响...例如,一个好的CMS还将自动更新htaccess以添加重定向到新的slug名称,以便您想要在单个URL上拥有所有正面的SEO权重,而不是分布在相同内容的不同URL上...此外,我经常翻转链接并检查URL(其中包含有用的slug)以获得关于我即将点击的内容的一些见解,然后再进行操作。 - rmorse
显示剩余5条评论

18
对我来说,“友好的URL”意味着已经尝试在URL中包含语义信息,以使其更适合人类使用。这是计算机界面被增强和改进以创建更好的人机界面的有趣例子。
因此,在您的两个示例中:
- `www.myblog.com/posts/123/this-is-the-name-of-my-blog-post`很友好,因为您在URL中包含了标题 - 它“告诉”您页面的一些信息。 - `www.myblog.com/posts.aspx?id=123`不友好,因为它很神秘和晦涩:对于数据库来说是完全有意义的,但对于您和我来说却无意义。
友好的URL在某些情况下非常出色,但在其他情况下则无用。基本上,如果用户将要接触到它,我会把友好的URL创建作为一个优先事项,并且这不仅仅是美学问题。如果您可以快速查看和理解各种选项,那么从地址栏返回URL将变得容易得多,此外,如果您正在从网页上的链接进行跟踪,它还使即将访问的位置更加明显。
结合Firefox 3+中的Awesome Bar(肯定也将出现在其他浏览器中),当您处理友好的URL时,地址栏自动完成功能变得非常强大。

1
我同意,使用自动完成是很好的。Google 也会使用 URL 来匹配关键词,就像他们使用标题标签、元描述和页面本身一样! - Dan

11

关于查询字符串对网络爬虫的确切影响,存在很多相互矛盾的信息。但是大多数人认为如果查询字符串具有超过几个参数,则会损害您的SEO,因为长的查询字符串变量表示动态内容,因此大多数搜索引擎会更少地索引您的页面。

将 slug 添加到您的URL中,例如从您的示例中使用的“this-is-the-name-of-my-blog-post”,使得您的链接之间的差异更大,而不仅仅是简单的编号,并且在URL中添加了更重要的单词。这些都是搜索引擎寻找的特征。

就我个人而言,我认为这样的 URL 更容易在视觉上解析,因为使用的标点符号较少,并且查询字符串中的名称-值对可能非常冗长且难以记忆。


1
我不同意。Google、Live Search和其他高质量的搜索引擎不会丢弃查询字符串。随着搜索引擎朝着网站所有者的需求而非相反方向发展,整个SEO垃圾正在逐渐结束。 - Andrei Rînea
抱歉,但是什么?任何值得使用的搜索引擎都不会丢弃返回有用搜索结果所需的查询字符串数据。+1 安德烈:可发现性与开发人员一样重要(如果不是更重要),是搜索引擎的工作。 - Christian Nunciato
我不知道有任何引擎会丢掉查询字符串。我听说谷歌曾经忽略长值,以为它们是会话ID,但你展示的短值根本不会被丢弃。 - Peter Morris
现代搜索引擎确实不会丢弃查询字符串,尽管具有许多参数对您的SEO不利。为了提供更好的示例进行编辑。 - Adam Lassek

7
关于您在 URL 中添加不必要信息的观点是正确的。
https://dev59.com/mXRB5IYBdhLWcg3wxZxK

一旦知道了唯一标识符522466,其余部分就没有用处了,因此它纯粹是为了使URL看起来“好看”,并让用户了解页面链接的内容。但这又带来了另一个问题。大多数网站不会“验证”URL的这一部分,因此您可以随意更改--

https://dev59.com/mXRB5IYBdhLWcg3wxZxK

然而它仍将链接到这篇文章。你可以看到这可能会引起比它们值得的更多问题,因为它们可能被恶意使用。

我认为Digg采取了正确的方法。他们不在URL中使用ID。在幕后,他们仅根据给定的标题从数据库获取ID。

http://digg.com/linux_unix/I_Like_Linux_so_my_aunt_sends_me_this_for_Christmas

对我来说,这是一个完美的URL。它为我提供了所有必要的信息,让我可以放心地点击该链接。

事实上,在digg的世界里,标题起着非常重要的作用,人们会基于标题而“盲目digg”,或者因为对标题感兴趣。如果您的URL看起来很有趣,那么您的网站可能会得到更多的流量。同时,您将使其更加用户友好、美观,搜索引擎也会感谢您。据我所知,友好的URL对每个人都是双赢的。


如果文档标题更改,这可能会出现错误。 - deamon
1
@deamon。所以要像WordPress一样做,当文章标题更改时放置重定向。 - TRiG
1
两篇文章标题相同时出现问题。 - user142019

6

以下是我对你提出的三点看法:

  • 我认为这个URL并不是最优的。我不知道为什么会同时显示文章标识符和标题。我从来不在我的URL中包含文章ID,只有标题和(有时)日期。
  • 对于用户来说,越短越好。
  • 搜索引擎会查看URL。无论它是否有意义,它们都会这样做。在URL中使用关键字将提供一些SEO效益。

我认为人们复制ID和token/slug是因为他们懒惰,解析ID并查找比创建token、存储它并查找更容易。这也允许您在ID不同的情况下拥有两个具有相同token的页面。 - John Sheehan

4
我同意你的观点,但是 别告诉任何人。
只是我的个人看法,但对我来说似乎很傻。
https://dev59.com/mXRB5IYBdhLWcg3wxZxK

并且

https://dev59.com/mXRB5IYBdhLWcg3wxZxKwhat-makes-a-friendly-url

这两个页面是相同的。我的意思是,我可以看出连字符的问题标题给URL提供了一些上下文,但是除非你知道该部分是可选的,否则URL只会不必要地变长。


我认为在这种情况下,Stack Overflow 正试图处理两个不同的问题。一是他们想要获得 SEO 的好处,因此使用 MVC/RAILS 类似的 URL。 - Randolpho
1
他们希望有一个用户友好的URL,因此在URL中包含标题。但是,如果只根据标题来生成关键字,很可能会与其他人的标题重复。因此,他们同时使用ID和标题。 - Randolpho
我应该澄清一下,我认为在URL中包含标题是有好处的,可以提供上下文。我也认为仅使用ID作为URL并不友好。但即便如此,我个人更喜欢尽可能简洁、最短的URL。罪魁祸首:Google Maps,Sharepoint等。 - JMD
1
我认为,一个易读、易记的URL比数字混乱更加简洁。 - Chuck
1
包含页面标题的短横线URL(如SO上的这里)并不是为了用户的利益而设计的。没有人会键入该URL,或者尝试基于主题的连字符化URL化来查找页面。这是纯粹的SEO技巧,远不及反向链接重要。 - Matt Howell
显示剩余2条评论

4

首先,它们对搜索引擎爬虫非常友好。Google和其他搜索引擎非常重视URL中与页面上匹配的单词,因此如果您的博客文章标题在URL中出现,这将有助于提高您的搜索引擎排名。

其次,它们对那些不知道自己正在访问什么的人也很友好。如果您在Twitter/电子邮件/即时通讯等平台上看到下列哪个链接,您更可能会点击哪个?


4

啊...关键在于URL对谁友好。搜索引擎认为第一个URL更友好,因为它显然在URL中包含了内容信息,而且看起来不像是同一页面重复使用不同参数。

例如,比较以下两个URL:

www.aTvShowSite.com/show.aspx?id=123
www.aTvShowSite.com/show.aspx?id=124

一个机器人会说“好的,我不知道这些是什么……但它们看起来对我来说是相同的页面。”

而对比:

www.aTvShowSite.com/shows/AmericanIdol
www.aTvShowSite.com/shows/Lost

使它们看起来像不同的页面(即使它可能是相同的aspx页面为它们服务),机器人倾向于将它们排名更高。
编辑: 此外,应注意许多机器人查看url文本以确定有用性,因此搜索“Lost”很可能会更多地命中第二种类型的url,即使页面内容相同。

4

关于:

这不违反“不要重复自己”的口号吗?

这是指应用程序代码!,而不是应用程序本身!

在<title>标签中有标题,在URL中也有,在内容的第一行也有。

  • 以及几乎所有其他需要它的地方。

“口号”所指的是您的代码应如下所示:

  <title><%=obj.getTitle()%></title>
  Reading:<h1><%=obj.getTitle()%></h1>
  Link to this:<a href="getHrefFor( object.getTitle() )">obj.getTitle()</a>
  Etc. etc.

不要在你的应用程序中到处复制/粘贴代码,而是使用不同的方法。


另一个编程原则的例子是不适用于用户界面的信息隐藏(如封装)。在良好的UI中,您应该同时显示所有相关信息(这有助于减少精神负担),而不是隐藏它或仅显示一小部分信息。 - Esko Luontola

3
你展示的“不友好”的URL暴露了一个实现细节: 如果将来有一天你决定放弃ASP并使用其他东西怎么办?你必须更改所有的URL(很糟糕!)或采用重命名方案。
在URL中重复标题可能并不是那么必要,但当你经常进行链接粘贴时,它会变得非常方便,可以双重检查你是否链接到正确的位置。

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