我打算在Meta上问这个,但我认为这是一个足够普遍的问题,可以在这里保证一个地方。
我很想知道您管理网站固定链接的一些方法,特别是根据可能随时间变化的数据构建的永久链接。
StackOverflow就是一个很好的例子,其中问题的URL部分来自问题标题。 如果问题的标题发生变化,我不确定是否会发布问题的链接。我的猜测是,它不会,如果确实如此,原始网址可能会保留规范。
在SO上更改标题不会更改网址
鉴于通常的做法是针对数据库中的帖子存储永久链接?如果是这样,你会存储多少永久链接?
我问后者是因为在SO的上下文中只有一部分URL是变量的,那就是问题标题。那么我们应该只存储已清理的标题并根据我们从帖子中获得的静态信息来构建其余的标题,还是应该存储整个URL,包括控制器名称和Id(等等)?
答案 0 :(得分:3)
您通常需要的是一些唯一标识您要链接到的数据项的标识符(在SO的情况下是问题)。如何构建您的URL更多的是您认为您能够长期支持的内容以及如何向读者传达其他信息。
如果您查看SO网址,您会注意到他们将唯一标识符放在开头(/ questions /之后的数字),这足以解决问题(尝试将垃圾放入网址的其余部分,它会仍然重定向到你的问题)。因此,最后的标题对于用户来说只是一个眼睛,并没有真正用于解决问题。
答案 1 :(得分:3)
我认为将永久链接存储在数据库中相对常见。空间很便宜,并且字符串解析功能可能很昂贵(每次要显示链接时,问题标题HTTP友好几千次,数千个问题会占用一些处理器)。
至于存储多少,就个人而言,我只会将您的问题/帖子标题的HTTP友好版本存储在数据库中(连同主键),原因如下。
通过操作和控制器存储与自身相关的整个或部分URL将使得在未来重构/重命名这些内容变得非常非常困难。您可能需要运行大量数据库更新或自定义URL重写等。
只存储友好版本的标题,您可以在其他地方使用它。我们以此网址为例,它可能是由@Html.ActionLink(Question.Title, "Index", new {controller = "Questions", Id = Question.Id, Slug = Question.Slug})
生成的。将slug作为单独的参数保存,您可以在其他控制器/操作调用中使用questionId和questionSlug参数,并保持您的URL漂亮。