URL路由:创建友好URL时处理空格和非法字符



我看过很多关于URL路由的讨论,还有很多很棒的建议。。。但在现实世界中,有一件事我没有看到讨论过:

  1. 使用空格和非法字符创建友好URL
  2. 查询数据库

假设您正在构建一个医疗网站,该网站有文章,包含类别和可选的子类别


类别/子/文章结构示例:

  1. 您的总体健康状况(类别)
    • 自然健康(子类别)
      1. 你身体的免疫系统以及为什么它需要帮助(文章)
      2. 植物和草药真的是解决方案吗
      3. 我应该吃强化食品吗
    • 顺势疗法医学
      1. 什么是顺势疗法药物
    • 健康饮食
      1. 你应该每天喝10杯咖啡吗
      2. 有机蔬菜值得吗
      3. 汉堡王®邪恶
      4. "法式咖啡馆"还是美式咖啡更健康
  2. 疾病;条件(类别)
    • 自身免疫障碍(子类别)
      1. 人的头号杀手是某种疾病
      2. 如何获得帮助
    • 遗传条件
      1. 预防妊娠前Spina Bifida
      2. 你有长寿的倾向吗
  3. 博士。FooBar的个人建议(类别)
    1. 我对草药的思考;自然疗法(文章-无子类别)
    2. 你为什么要关心你的健康
    3. 正确饮食和良好饮食是可能的
    4. 不流血手术已经成熟了吗

在这样的结构中,如果你去:/{类别}/{子类别}\{文章标题}

此外,还有许多非法字符,如#!?'é"等

所以,问题是:

  1. 您将如何处理非法字符和空格?(优点和缺点?)
  2. 你能处理从数据库中获取这个吗
    • 换句话说,您是信任DB找到项目,传递标题,还是提取所有标题并在代码中找到密钥,以获得传递给数据库的密钥(对数据库的两次调用)

注意:我总是看到一些漂亮的例子,比如/products/饮料/短产品名称/如何处理一些丑陋的例子^_^

如果你要去掉空格,出于可读性的原因(你在上面加下划线,_实际上是go_away),我自己更喜欢_。

你可能想尝试铸造扩展字符,例如,ü,以尽可能关闭ascii等价物,例如:

ü->u

然而,根据我的经验,实际SEO相关问题的最大问题不是URL包含了所有可爱的文本,而是当人们更改链接中的文本时,你所有的SEO工作都会变成垃圾,因为你现在在索引中有DEADLINKS

为此,我建议stackoverflow做什么,并有一个引用常量实体的数字部分,完全忽略文本的其余部分(和/或在错误时更新它)

此外,严重的遗传性只会使人类的可用性变差。人类讨厌长URL。复制粘贴它们很糟糕,而且它们更容易被破坏。如果你能把它细分为较低的层次()

/article/1/Some_Article_Title_Here
/article/1/Section/5/Section_Title_Here
/section/19023/Section_Title_here  ( == above link ) 

这样,你唯一需要做巫毒魔法的时候是当编号的文章实际上已经被删除时,这时你可以使用文本部分作为搜索字符串来尝试找到真正的文章或类似的东西。

我的最后一种方法是:

  1. 将所有"奇怪的字母"转换为"普通字母"->à转换为a、ñ转换为n等
  2. 将所有非单词字符转换为_(即非a-zA-Z0-9)
  3. 用单个下划线替换下划线组
  4. 删除所有尾部和前导下划线

至于存储,我认为友好的URL应该进入数据库,并且是不可变的,毕竟很酷的URI不会改变

解决方案2是这些。。。为了可读性,可以进行一些改进,例如将撇号改为零而不是破折号。通常,您会希望在数据库中存储标题的URL有效性版本以及"真实"标题,这样您就可以使用索引select WHERE来选择项目。

然而。URL路径部分中没有实际的非法字符,只要您对其进行适当的编码即可。例如,空格、散列或斜线可以编码为%20、%23或%2F。通过这种方式,可以将任何字符串编码到URL部分,这样您就可以通过实际的、不变的标题将其从数据库中选择出来。

不过,根据您的网络框架,这可能会带来一些问题。例如,任何基于CGI的东西都无法区分编码的%2F和真实的/,并且一些框架/部署可能难以使用Unicode字符。

或者,一个简单而安全的解决方案是在URL中包含主键,使用标题部分纯粹是为了让地址更好。例如:

http://www.example.com/x/category-name/subcat-name/article-name/348254863

亚马逊就是这样做的。它的优点是你可以更改数据库中的标题,并将旧标题的URL自动重定向到新标题。

如果有人感兴趣。这是我要走的路线(哦…小):

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"));

这为我提供了这样做url的能力:

  • site.com/ca/en/Article/123/my-life and health
  • site.com/ca/en/Section/12-3/Health-Issues
  • 网站.com/ca/en/Section/12/

在清理URL时,我使用了一种方法来替换重音字符:

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"或其他什么的方法,但这取决于您。

作为后续行动。我确实有一些想法。因此,请随意评论这些想法或给出您自己的问题答案:

解决方案#1:用破折号替换所有非法字符:

  • www.mysite.com/diseases-conditions/Auto immunol disorders/the--1-killer-of-ppeople-is-some-dises/

这在我看来有点难看…

解决方案#2:去掉非法字符并用单点划线替换空格:

  • www.mysite.com/diseases conditions/Auto immunol disorders/the-1-killer-of-ppeople-is-some-disease/

解决方案#3应用一些规则将某些字符替换为单词:

  • www.mysite.com/diseases and conditions/Auto immune disorders/the-number1-killer-of-ppeople-is-some-dsease/

解决方案#4去掉所有空格并使用大写

  • www.mysite.com/DiseasesAndConditions/AutoImmune Disorders/TheNumber1KillerOfPeopleIsSomeDisease/

(可能在区分大小写的服务器上工作不好,很难阅读)

我建议使用解决方案2。我不是世界上最大的SEO专家,但我相信这几乎是获得良好排名的"标准"方法。

我通常只允许使用合法字符,并尽可能缩短友好的URL。同样重要的是,友好的URL通常是由人工插入的,我从不从标题或内容中生成友好的URL,然后使用该URL来查询数据库。我会在表中使用一列,例如friendly_url,这样网站管理员就可以插入友好的url。

我解决了这个问题,在数据库中添加了一个额外的列(例如:标题列旁边的UrlTitle),并用"&"保存了一个去掉所有非法字符的标题符号替换为"one_answers",空格替换为下划线。然后,您可以通过UrlTitle进行查找,并在页面标题中或任何位置使用真实的URL。

我建议做wordpress所做的事情——去掉小字,用破折号(最多1个破折号)回复非法字符,然后让用户根据需要更正URL。SEO最好让URL可配置。

作为一名客户端用户,而不是网页设计师,我发现Firefox有时会在试图用可用字符替换"非法"字符时破坏URL。例如,FF将~替换为%7E。这对我来说永远不会加载。我不明白为什么HTML编辑器和浏览器不简单地同意不接受A-Z和0-9以外的字符。如果某些脚本需要%?,因此,更改脚本应用程序,使其能够使用字母数字。

最新更新