URL路由:创建友好URL时处理空格和非法字符
我看到了很多关于URL路由的讨论,还有很多很棒的建议。。。但在现实世界中,有一件事我没有看到:URL路由:创建友好URL时处理空格和非法字符,url,routing,character,Url,Routing,Character,我看到了很多关于URL路由的讨论,还有很多很棒的建议。。。但在现实世界中,有一件事我没有看到: 创建带有空格和非法字符的友好URL 查询数据库 假设您正在构建一个医疗网站,其中包含文章,其中包含类别和可选的子类别。(一对多)。(可以用任何例子,但医学领域有很多长词) 示例类别/子/文章结构: 您的一般健康状况(类别) 自然健康(子类别) 你身体的免疫系统以及为什么它需要帮助(文章) 植物和草药真的是解决办法吗 我应该吃强化食品吗 顺势疗法医学 什么是顺势疗法药物 健康饮食 你应该每天喝1
示例类别/子/文章结构:
- 自然健康(子类别)
- 你身体的免疫系统以及为什么它需要帮助(文章)
- 植物和草药真的是解决办法吗
- 我应该吃强化食品吗
- 自身免疫障碍(子类别)
- 人类的头号杀手是某种疾病
- 如何获得帮助
在这样的结构中,如果您: /{类别}/{子类别}/{文章标题} 此外,还有大量非法字符,如#!?'"等 因此,问题是:
- 换句话说,您会信任DB查找项目,传递标题,还是拉取所有标题,并在代码中找到密钥,以获得要传递到数据库的密钥(对数据库的两次调用)
注意:我总是看到一些漂亮的例子,比如/products/beverages/Short Product Name/如何处理一些丑陋的例子作为后续。我确实有一些想法。所以请随意评论这些想法或给出您自己的问题答案: 解决方案#1:用破折号替换所有非法字符:
- www.mysite.com/diseases---conditions/Auto-immunity disorders/the--1-killer-of-people-is-some-disease/
- www.mysite.com/diseases-conditions/Auto-immune disorders/the-1-killer-of-people-is-some-disease/
- www.mysite.com/diseases and conditions/Auto immune disorders/the-number1-killer-of-people-is-some-disease/
- www.mysite.com/DiseasesAndConditions/autoimmedisorders/thenumber1killerof people issomedisease/
(可能无法在区分大小写的服务器上正常工作,并且难以阅读)解决方案2将是我的建议。我不是世界上最大的SEO专家,但我相信这几乎是获得好排名的“标准”方式。我通常做的是只允许合法字符,并保持友好URL尽可能短。同样重要的是,友好URL通常由人插入,我从不生成从标题或内容中获取友好URL,然后使用该URL查询数据库。我会在表中使用一列,例如友好URL,以便网站管理员可以插入友好URL。我的最后一种方法是:
至于存储,我认为友好的URL应该进入数据库,并且是不可变的,毕竟我通过在数据库中添加一列(例如:标题列旁边的URL标题)解决了这个问题并保存一个标题,去掉所有非法字符,用“&”符号替换为“and”,空格替换为下划线。然后,您可以通过URL标题进行查找,并在页面标题或任何地方使用真实的标题。解决方案2是这些问题的典型方法……一些改进是可能的,例如,将撇号改为空而不是空破折号,用于可读性。通常,您希望在数据库中存储标题的munged for URL validity版本以及“真实”标题,以便使用索引选择位置来选择项目 但是,只要对URL路径部分进行适当编码,URL路径部分中就没有实际的非法字符。例如,空格、哈希或斜杠可以编码为%20、%23或%2F。通过这种方式,可以将任何字符串编码到URL部分,因此您可以通过实际的、未更改的标题将其从数据库中选择出来 但是,这取决于您的web框架。例如,基于CGI的任何东西都无法区分编码的%2F和真实的/,并且某些框架/部署可能难以使用Unicode字符
http://www.example.com/x/category-name/subcat-name/article-name/348254863
/article/1/Some_Article_Title_Here
/article/1/Section/5/Section_Title_Here
/section/19023/Section_Title_here ( == above link )
Route r = new Route("{country}/{lang}/Article/{id}/{title}/", new NFRouteHandler("OneArticle"));
Route r2 = new Route("{country}/{lang}/Section/{id}-{subid}/{title}/", new NFRouteHandler("ArticlesInSubcategory"));
Route r3 = new Route("{country}/{lang}/Section/{id}/{title}/", new NFRouteHandler("ArticlesByCategory"));
private static string anglicized(this string urlpart) {
string before = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ’ñ";
string after = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n";
string cleaned = urlpart;
for (int i = 0; i < avantConversion.Length; i++ ) {
cleaned = Regex.Replace(urlpart, before[i].ToString(), after[i].ToString());
}
return cleaned;
// Here's some for Spanish : ÁÉÍÑÓÚÜ¡¿áéíñóúü"
}
string articleTitle = "My Article about café and the letters àâäá";
string cleaned = articleTitle.anglicized();
// replace spaces with dashes
cleaned = Regex.Replace( cleaned, "[^A-Za-z0-9- ]", "");
// strip all illegal characters like punctuation
cleaned = Regex.Replace( cleaned, " +", "-").ToLower();
// returns "my-article-about-cafe-and-the-letters-aaaa"