我已经看过很多关于URL路由的讨论,以及很多很棒的建议......但在现实世界中,我还没有看到过的一件事是:
假设您正在构建一个医疗网站,其文章的类别和可选的子类别。 (1对多)。 (可以使用任何示例,但医疗领域有很多长词)
在这样的结构中,如果你去的话,你将会有一些 LOOONG网址: / {Category} / {subcategory} / {Article Title}
此外,还有很多非法字符,就像#! ? 'é“等。
注意:我总是看到漂亮的漂亮例子,例如/ products / beverages / Short-Product-Name /如何处理一些丑陋的例子^ _ ^
答案 0 :(得分:4)
我的最后一种方法是:
至于存储,我认为友好的URL应该转到数据库,并且毕竟是cool URIs don't change
是不可变的答案 1 :(得分:4)
我自己更喜欢_以 - 出于可读性的原因(你给它加下划线而_
实际上是go_away),如果你要剥离空格的话。
你可能想尝试在可能的情况下将扩展字符(即ü)转换为as-ascii equivelants,即:
ü - >你
但是,根据我的经验,实际 SEO相关问题的最大问题不在于URL包含所有可爱的文本,而是当人们更改文本时链接,你所有的SEO工作都变成废话,因为你现在在索引中有 DEADLINKS 。
为此,我建议stackoverflow做什么,并有一个引用常量实体的数字部分,并完全忽略文本的其余部分(和/或在错误时更新它)
此外,严重的hericichial性质只会导致人类的可用性差。人类讨厌长网址。复制粘贴它们很糟糕,它们更容易破碎。如果你可以将它细分为较低的teirs,即
/article/1/Some_Article_Title_Here
/article/1/Section/5/Section_Title_Here
/section/19023/Section_Title_here ( == above link )
这样你唯一需要做巫术魔术的时候就是当编号的文章实际已经被删除时,你在这个时候使用文本部分作为搜索字符串来尝试找到真正的文章或类似的东西。
答案 2 :(得分:1)
解决方案2是那些的典型方法......一些改进是可能的,例如。为了便于阅读,将撇号变为零而不是破折号。通常,您需要在数据库中存储标题的munged-for-URL-validity版本以及“真实”标题,因此您可以使用索引的SELECT WHERE选择项目。
然而。只要对其进行适当编码,URL路径部分中就没有实际的非法字符。例如,空格,散列或斜杠可以编码为%20,%23或%2F。通过这种方式,可以将任何字符串编码为URL部分,因此您可以通过实际的,未更改的标题将其从数据库中删除。
但是这有一些潜在的问题,具体取决于您的Web框架。例如,基于CGI的任何内容都无法区分编码的%2F和real /之间的差异,而某些框架/部署可能会遇到Unicode字符的困难。
或者,一个简单而安全的解决方案是在URL中包含主键,使用标题部分纯粹是为了使地址更好。例如:
http://www.example.com/x/category-name/subcat-name/article-name/348254863
这就是例如。亚马逊做到了。它的优势在于您可以更改数据库中的标题,并将具有旧标题的URL自动重定向到新标题。
答案 3 :(得分:1)
如果有人有兴趣。这是我正在采取的路线(噢......惩罚):
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"));
这使我能够像这样做网址:
答案 4 :(得分:1)
清理网址时,这是我用来替换重音字符的方法:
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 : ÁÉÍÑÓÚÜ¡¿áéíñóúü"
}
不知道它是否是效率最高的Regex,但它确实有效。这是一个扩展方法,所以要调用它,你只需将方法放在静态类中,并做这样的事情:
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"
当然,您可以将它组合成一个名为“CleanUrl”的方法,或者其他方法,但这取决于您。
答案 5 :(得分:0)
作为后续行动。我确实有一些想法。因此,请随意评论这些想法,或者对问题给出自己的答案:
解决方案#1:用破折号替换所有非法字符:
这对我来说有点难看......
解决方案#2:删除非法字符并用单个破折号替换空格:
解决方案#3应用一些规则用单词替换某些字符:
解决方案#4删除所有空格并使用大写
(可能在区分大小写的服务器上运行良好且难以阅读)
答案 6 :(得分:0)
解决方案2将是我的建议。我不是世界上最大的SEO专家,但我相信它几乎是获得良好排名的“标准”方式。
答案 7 :(得分:0)
我通常做的是只允许合法字符,并尽可能缩短友好网址。同样重要的是,友好的URL通常由人插入,我从不从标题或内容生成友好的URL,然后使用该URL查询数据库。我会在表中使用一列,例如friendly_url,以便网站管理员可以插入友好的URL。
答案 8 :(得分:0)
我通过在数据库中添加一个额外的列来解决这个问题(例如:标题列旁边的UrlTitle)并使用'&amp;'保存一个剥夺了所有非法字符的标题符号替换为'和',空格替换为下划线。然后你可以通过UrlTitle查找并使用页面标题中的真实或任何地方。
答案 9 :(得分:0)
我建议做wordpress的工作 - 删除小字并用破折号(最多1个破折号)重复非法字符,然后让用户根据需要更正URL。 SEO最好使URL可配置。
答案 10 :(得分:0)
作为客户端用户,而不是Web设计人员,我发现Firefox在尝试将“非法”字符替换为可用字符时有时会破坏URL。例如,FF用%7E替换〜。从来没有为我加载。我不明白为什么HTML编辑器和浏览器不同意不接受A-Z和0-9以外的字符。如果某些脚本需要%,?等,请更改脚本应用程序,以便它们可以使用字母数字。