URI 设计指南

Avatar of Jacob Gillespie
Jacob Gillespie 发布

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费额度!

这是一篇由 Jacob Gillespie 撰写的客座文章,他在 Forrst 上关于此主题发起了一个有趣的 帖子。 我邀请他在这里发布,他欣然接受了。

在过去的几年里,我对可用性和网页设计产生了兴趣。 在网站设计中,一个经常被忽视的领域是网站上URI的设计。现代CMS系统允许在一定程度上自定义 URI,但默认值通常不如其应有的可用性高,并且 URI 通常在设计流程中被放在最后。

简洁的 URI 是简洁网站的一个组成部分,也是一个重要的组成部分。 大多数最终用户访问互联网都涉及到 URI,无论用户是否实际输入 URI,他们都在使用它。

首先,我想谈谈 URI 设计背后的指导原则,然后谈谈这些原则的实际实施。

注意:最初,我在撰写本文草稿时使用了“URL”一词,但由于“URL”已被“URI”取代,我已更新为使用“URI”一词。 来自 W3C 的更多信息

原则

首先,让我们看看一些 URI 设计的一般原则。

URI 必须唯一且永久地表示一个对象

URI 最基本的理念之一是它代表互联网上的一个数据对象。 URI 必须是唯一的,以便实现一对一匹配——每个数据对象对应一个 URI。

虽然这始终是目标,但在某些情况下,实现起来非常困难或不可能。 规范 URL 标签的发明是为了帮助减少搜索引擎看到的重复内容的数量。 虽然这不是最终的解决方案,但强烈建议使用规范 URL,因为 Google 等大型搜索引擎现在正在关注它们。 有关规范 URL 的更多信息,请查看 SEOmoz 的这篇文章

URI 也应该是永久的(即,选择 URI 一次,然后保持不变)。 这说明了在网站启动之前进行良好的 URI 设计,并仔细计划 URI。 会有那么一天,您希望改进您的选择或出于其他原因必须更改 URI 结构。 当这成为必要时,请务必设置 HTTP 301 永久移动 重定向到您的服务器上。 这会告诉浏览器和搜索引擎内容的新位置,并保留旧 URI 累积的任何 PageRank

尽可能人性化

这是 URI 设计(或应该成为)最基本的驱动力。 URI 的设计应以最终用户为中心。 搜索引擎优化 (SEO) 和开发简易性应放在第二位。

保持 URI 对用户友好的方法之一是使其简洁明了。 这意味着在保持可用性的同时使用尽可能少的字符。 因此,/about/about-acme-corp-page 更好。 虽然努力使其尽可能短,但它不应牺牲用户友好性而使用诸如 /13d2 之类的 URI,因为这对最终用户没有任何意义。

相反,建议在共享 URI 时使用 短链接。 这非常适合在 Twitter 上发布链接,或在 Facebook 或 Google Buzz 等社交网站上共享。 如果出于 SEO 原因您可以控制自己的 URI 缩短器,那将非常棒,尽管像 Bit.ly 这样的网站也很好。 我个人使用 PrettyLink Pro(一个 WordPress 插件)来创建我的短 URI。 另一种选择是 Short URL 插件

WordPress 提供了一个按钮,可以根据 WordPress 自己的 /?p=XXX 格式获取文章的短链接,该格式可能比您选择的永久链接结构更短。 优点是只要您的网站存在,它就会起作用。 缺点是链接的短度取决于您域名名的长度。

URI 不应依赖于与内容或用户无关的信息。 一个常见的例子是使用数据库 ID 作为 URI,例如 /products/23。 最终用户并不关心该产品是数据库记录编号 23,因此诸如 /products/ballpoint-pen 之类的 URI 更好。 采用这种糟糕的 URI 结构可能很诱人,因为它在后端使用 ID 查询数据库通常更容易,而不是必须对别名进行查找以找到对象。

判断 URI 是否为用户友好 URI 的一个好方法是“语音友好”测试。 您应该能够在与朋友的对话中提及一个 URI,并且它应该是有意义的。 例如

我的个人资料在 domain dot com 斜杠 jim

而不是

我的个人资料在 domain dot com 斜杠 page 斜杠 g g 2 3

一致性

整个网站的 URI 必须在格式上保持一致。 选择 URI 结构后,请保持一致并遵循它! 对网站的一部分拥有良好的 URI 结构意味着您总体上仍然拥有糟糕的结构。 为了让用户相信 URI 在网站上的工作方式,格式必须一致。 如果您必须切换结构(也许您正在更新一个设计糟糕的网站),请使用前面提到的 301 重定向。

“可修改”的 URI

与一致性相关的是,URI 的结构应使其可以理解地“可修改”或可更改。 例如,如果 /events/2010/01 显示 2010 年 1 月的月历,其中包含 1 月的事件,那么

  • /events/2009/01 应显示 2009 年 1 月的事件日历
  • /events/2010 应显示 2010 年全年的事件
  • /events/2010/01/21 应显示 2010 年 1 月 21 日的事件

关键词

URI 应由与页面内容相关的关键词组成。 因此,如果 URI 是针对一篇标题很长的博文,则只有对页面内容重要的词语应该包含在 URI 中。 例如,如果博文是“我的百思买内存卡之旅”,那么 URI 可能是 /posts/2010/07/02/trip-best-buy-memory-cards 或类似内容。

作为额外的好处,在 URI 中使用重要的关键词将提高 SEO。 我个人的 SEO 理念是,与其为了搜索引擎而优化,不如为了优质内容而优化。 搜索引擎的目标是找到网络上最好的内容,因此,在我看来,尽一切努力创建一个易于使用的网站,提供很棒的内容和进一步信息(链接)的机会,将产生搜索引擎可见性的最佳长期效果。

技术细节

我们已经介绍了一些 URI 设计背后的指导原则。 现在,让我们看看这些指南的一些技术实现。

没有底层技术的痕迹

URI 不应附加 .html、.htm、.aspx(一个很大的烦恼)或任何其他仅用于显示底层技术的内容。 没有任何最终用户关心您的网站是用 ASP.NET(.aspx)、ColdFusion(.cfm)编写的,或者使用了服务器端包含(.shtml)——至少大多数最终用户不关心。 这些额外信息只会增加输入量,并增加出错和令人沮丧的可能性。

此规则的一个例外是将 URI 附加后缀,如 .atom、.rss 或 .json,以请求返回特定格式。 或者,可以使用 Accept HTTP 标头请求格式。

不使用 WWW

网站 URI 中应该去除 www.,因为它是多余的输入,违反了尽可能人性化以及 URI 中不包含多余信息的原则。

然而,许多用户仍然会输入 www. 前缀,因此 www.domain.com 应该 301 重定向到 domain.com。同样的,www.subdomain.domain.com 也应该 301 重定向到 subdomain.domain.com

格式

URI 应该采用以下格式:

domain.com/[关键信息]/[名称]/?[修饰符]

关键信息是指并非对象标识符(例如帖子标题),但对于访问的对象仍然至关重要的信息。这可能包括:

  • 事物的类型(例如帖子)
  • 总体父类别(例如技术)
  • 关键数据成员(例如发布日期)

修饰符修改视图,而不是表示的数据模型,因此它们是查询字符串的一部分,而不是 URI 本身。

“关键信息”的数量应该保持最少,因为 URI 不应该过度嵌套。关键信息部分中的每个项目都必须真正是解决页面的关键。

最终,URI 应该表示一个递降的层次结构。例如:

  • 域名
  • 类型
  • 类别
  • 标题

例如:http://domain.com/posts/servers/nginx-ubuntu-10.04。对于包含日期的项目,格式应遵循递降的层次结构:

  • 年份
  • 月份
  • 日期

例如:http://domain.com/news/tech/2007/11/05/google-announces-android

Google 新闻对希望出现在 Google 新闻结果中的网页有一些有趣的要求——Google 要求至少使用一个 3 位的唯一数字。由于他们会忽略看起来像年份的数字,因此建议使用 5 位或更多位的数字。还建议使用Google 新闻站点地图。在某些情况下,如果你必须针对 Google 新闻,则必须符合这种较差的 URI 结构。但是,如果你必须这样做,请确保保持一致,并且它仍然可操作(例如,使用 yyyymmdd 格式,如 20100701)。

全部小写

所有字符都必须是小写。当涉及混合大小写时,尝试向他人描述 URI 几乎是不可能的。

如果有人输入混合大小写的 URI,则应将其 301 重定向到小写页面。这听起来很棒,但在实践中,我不确定这是否可行……使用重写所有请求到单个文件的 CMS 将是最简单的实现方式,因为脚本可以发出 301 到小写,但我不确定是否有更简单的方法(.htaccess 规则或其他)。

附加到 URI 的操作

操作可以附加到 URI,例如 show、delete、edit 等。非破坏性操作(不会更改对象的操作)应该使用 HTTP GET 请求,而破坏性操作应该 POST 到 URI。有关更多信息,请在 Google 上搜索 REST URI 设计。

URI 标识符应使其对 URI 友好

URI 可能包含帖子的标题,并且该标题可能包含对 URI 不友好的字符。因此,必须使该帖子标题对 URI 友好。例如:

  • 所有大写字符都转换为小写
  • 像 é 这样的字符应该转换为 e(等等)
  • 空格应该用连字符替换
  • 未知字符(!、@、#、$、%、^、&、* 等)应该用连字符替换
  • 双连字符(–)应该替换为单个连字符
  • 可能还有更多我忘记的规则

字符可以进行 URI 编码(例如空格字符的 %20),但这通常不是一个好主意,原因与上述许多原因相同(显示技术、不必要的输入等)。

有趣的想法

使用类似句子的结构(感谢Chris Shiflett

chriscoyier.net/authored/digging-into-wordpress/
chriscoyier.net/has-worked-for/chatman-design/
chriscoyier.net/likes/trailer-park-boys

jacobwg.com/thinks/this-post/is/basically-done

如果你知道我错过的任何其他 URI 指南,或者对我想起的那些指南有任何意见,我很乐意听取你的意见!

鸣谢

非常感谢Forrst 社区,他们看到了这篇帖子的最初(非常)粗略草稿并贡献了许多有见地的评论。特别感谢@chriscoyier@caludio@steerpike@mattthehoople 对指南列表的直接贡献,以及所有其他 Forrst 评论者提供的有益讨论。

感谢我的爸爸校对和审阅!还要感谢 Chris 愿意在 CSS Tricks 上发布这篇帖子!