3

我上周设置的爬虫服务缺少的许多东西之一就是漂亮的 URL。现在,用户参数正在使用?u=传递到脚本中,这是一个惰性 hack 的症状(脚本当然是)。但是,我一直在考虑重做它,我想获得一些关于可用选项的反馈。现在有两个页面,更新和图表,为用户提供信息。这是我想出的两种可能性。“1234”是用户ID号。由于技术原因,遗憾的是不能使用用户名:

  • http://<tld>/update/1234
  • http://< tld >/chart/1234

或者

  • http://<tld>/1234/update
  • http://< tld >/1234/chart

从概念上讲,选项 #1 是使用用户 ID 调用更新。选项 #2 提供了一个动词来操作用户 ID。

从一致性的角度来看,哪个更有意义?


提到的另一个选项是

  • http://<tld>/user/1234/update
  • http://<tld>/user/1234/chart

这为与特定用户无关的页面提供了空间。IE

  • http://< tld >/stats
4

9 回答 9

6

如果您采用此方案,则可以很容易地阻止(行为良好的)机器人爬取您的网站:

 http://< tld >/update/1234
 http://< tld >/chart/1234

这是因为您可以设置一个 /robots.txt 文件来包含:

 Disallow /update/
 Disallow /chart/

对我来说,这是一个很好的奖励,但经常被忽视。

于 2008-09-23T21:28:07.767 回答
5

选项 #1 匹配常见的 ASP.NET MVC 示例。模型视图控制器模型中的一些示例具有 {controller}/{action}/{id} 的形式。.NET 3.5 路由快速入门有一个表格显示了一些有效的路由模式:

路由定义——匹配 URL 示例

{controller}/{action}/{id} -- /Products/show/beverages

{table}/Details.aspx -- /Products/Details.aspx

博客/{action}/{entry} -- /blog/show/123

{reporttype}/{year}/{month}/{day} -- /sales/2008/1/5

{locale}/{action}
-- /zh-CN/show

{language}-{country}/{action}
-- /zh-CN/show

于 2008-09-22T00:52:48.493 回答
5

我会倾向于使用用户标识——选项#2——因为(存在的)目录结构是对用户数据的两个不同功能。这是用户的图表,也是用户的更新。

不过,这是一个很小的问题,不知道是否有计划显着扩展这个东西的功能。

  • 未来的一切都将成为个人用户的附加功能 foo 和 bar 和 baz 吗?如果是这样,由于上述原因,选项 #2 变得更有吸引力——用户 ID 是核心数据,从语义上开始是有意义的。
  • 您要添加非用户驱动的功能吗?以标题目录开头可能是有意义的——/user/1234/update、/user/1234/chart、/question/45678/activity、/question/45678/stats 等。
于 2008-09-22T00:57:23.350 回答
4

我个人喜欢这种风格,因为它使用户保持不变,但让您对他们有具体的了解。

  • http://<tld>/1234/update
  • http://< tld >/1234/chart

如果您采用另一种方式,我希望能够看到 /update 或 /chart 下的所有内容,然后按用户缩小范围。

于 2008-09-22T00:50:56.797 回答
1

选择后者;URL 意味着是分层的(或者,至少,用户以类似于本地目录路径的方式读取它们)。这里的重点是对特定用户的不同看法,因此“用户”是更笼统的概念,应该首先出现。

于 2008-09-22T00:59:15.093 回答
1

我刚刚回答了“你如何构建你的 URL 路由?”这个问题。与我关于使 URL 成为 RESTful、可破解和用户友好的意见。我认为链接比在这个问题中写类似的东西更好,因此链接。

于 2008-09-23T21:18:31.610 回答
0

我同意从上下文的角度来看,应用程序后面的参数对我来说比项目的代理键和项目的上下文更有意义。最终,我会建议您编程哪个更自然。

于 2008-09-22T00:55:56.427 回答
0

约定说对象/动词/ ID,所以它应该是:

http://<tld>/user/update/1234

(我刚刚注意到这与您更新的问题相匹配:)

所以是的,#3 是最好的选择。

这支持您提到的非用户操作(stats/),以及多用户操作:

http://<tld>/user/list/

于 2008-09-22T01:12:44.077 回答
0

如果有一种列出用户的方式,我会介绍一个用户细分:

http://< tld >/users/ <--- user list
http://< tld >/users/1234/ <--- user profile, use overloaded POST on this to update.
http://< tld >/users/1234/chart/ <--- user chart

如果您只能看到自己的详细信息,即用户彼此不可见,则不需要用户 ID,因为您可以从会话中推断出来,在这种情况下:

http://< tld >/user/ <--- user profile, use overloaded POST on this to update.
http://< tld >/user/chart/ <--- user chart
于 2008-09-25T22:14:52.490 回答