【问题标题】:URL Routing: Handling Spaces and Illegal Characters When Creating Friendly URLsURL 路由:在创建友好 URL 时处理空格和非法字符
【发布时间】:2010-09-20 23:17:55
【问题描述】:

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

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

假设您正在构建一个医疗网站,其中包含带有 类别 和可选 子类别文章。 (1对许多)。 (可以举任何例子,但医学领域有很多长词


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

  1. 您的一般健康状况(类别)
    • 自然健康(子类别)
      1. 您身体的免疫系统及其需要帮助的原因。 (文章)
      2. 植物和草药真的是解决方案吗?
      3. 我应该吃强化食品吗?
    • 顺势疗法
      1. 什么是顺势疗法?
    • 健康饮食
      1. 您应该每天喝 10 杯咖啡吗?
      2. 有机蔬菜值得吗?
      3. 汉堡王®是邪恶的吗?
      4. “法式咖啡”还是美式咖啡更健康?
  2. 疾病和病症(类别)
    • 自身免疫性疾病(子类别)
      1. 人类的第一杀手是某种疾病
      2. 如何获得帮助
    • 遗传条件
      1. 在怀孕前预防脊柱裂。
      2. 您是否倾向于长寿?
  3. 博士。 FooBar 的个人建议(类别)
    1. 我对草药和自然疗法的看法(文章 - 无子类别)
    2. 为什么要关心自己的健康?
    3. 正确饮食和良好饮食是可能的。
    4. 无血手术已经成熟了吗?

在这样的结构中,如果你这样做,你将有一些 LOOONG URL: /{类别}/{子类别}/{文章标题}

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

所以,问题是:

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

注意:我总是看到漂亮漂亮的例子,例如 /products/beverages/Short-Product-Name/ 如何处理一些丑陋的例子 ^_^

【问题讨论】:

    标签: url routing character


    【解决方案1】:

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

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

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

    这对我来说有点难看......

    解决方案 #2:去除非法字符并用单破折号替换空格:

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

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

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

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

    • www.mysite.com/DiseasesAndConditions/AutoImmuneDisorders/TheNumber1KillerOfPeopleIsSomeDisease/

    (在区分大小写的服务器上可能无法正常工作并且难以阅读)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我最后的方法是:

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

          至于存储,我认为友好的URL应该去数据库,并且是不可变的,毕竟cool URIs don't change

          【讨论】:

            【解决方案5】:

            我通过在数据库中添加一个附加列(例如:标题列旁边的 UrlTitle)并保存一个去除了所有非法字符的标题,并将“&”符号替换为“和”,并将空格替换为下划线,从而解决了这个问题。然后您可以通过 UrlTitle 查找并在页面标题或任何地方使用真实的。

            【讨论】:

              【解决方案6】:

              解决方案 2 是其中的典型方法……可以进行一些改进,例如。为了可读性,将撇号变成空而不是破折号。通常,您需要将 munged-for-URL-validity 版本的标题以及“真实”标题存储在数据库中,以便您可以使用索引 SELECT WHERE 选择项目。

              但是。只要您对它进行适当编码,URL 路径部分中就没有实际的非法字符。例如,空格、哈希或斜杠可以编码为 %20、%23 或 %2F。这样就可以将 any 字符串编码为 URL 部分,因此您可以通过实际的、未更改的标题将其从数据库中选择出来。

              这有一些潜在的问题,这取决于您的 Web 框架。例如,任何基于 CGI 的东西都无法区分编码的 %2F 和真正的 /,并且某些框架/部署可能难以处理 Unicode 字符。

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

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

              这就是例如。亚马逊做到了。它确实具有您可以更改数据库中的标题并将具有旧标题的 URL 自动重定向到新标题的优点。

              【讨论】:

              • 好点,您必须在编码非法字符和删除它们以方便用户之间取得平衡。不仅亚马逊将 PK 添加到 url - Stack Overflow 也这样做了:)
              • 我真的很喜欢使用主键的想法。这就是我之前通过查询字符串传递的内容。
              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

                如果您要删除空格,出于可读性原因,我自己更喜欢 _ (您在上面加上下划线,_ 几乎是 go_away )。

                您可能想尝试将扩展字符(即 ü )转换为可能的 close-ascii 等效项,即:

                ü -> 你

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

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

                此外,严重的遗传性只会使人类的可用性变差。人类讨厌长网址。复制粘贴它们很糟糕,而且它们更容易破裂。如果可以细分为下级,即

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

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

                【讨论】:

                • 好主意,但下划线看起来像带下划线的链接中的空格,因此您可能会遇到问题。不过,另一个建议看起来不错。
                • 这是看起来最灵活的方法。我已经对其进行了测试,它似乎运行良好。忽略 TItle,只使用 ID。
                • 好的,这似乎很有用,但是如果有人更改了 id,您将如何处理,例如:/section/123/Section_Title_here in /section/222/Section_Title_here ...如果有人更改了在浏览器的 url 中,然后页面进行完整的回传,但是 Section_Title_here 不会改变...您应该手动更改它.. 怎么样?
                • @janilemy 更改部分的 id 是设计错误。因为您没有更改它,所以至少从用户的角度来看,您实际上是在创建一个新的并删除旧的。如果您希望使 ID 更改成为可能,那么您需要一个回退机制来跟踪 old_id => new_id 翻译。从本质上讲,文本部分永远无法帮助您,您应该像在数据库中一样使用 ID 来实现引用完整性。
                【解决方案9】:

                万一有人感兴趣。这是我要走的路线(哦……双关语):

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

                这使我能够像这样执行网址:

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

                【讨论】:

                  【解决方案10】:

                  在清理 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 : ÁÉÍÑÓÚÜ¡¿áéíñóúü"
                  
                  }
                  

                  不知道它是否是最有效的正则表达式,但它肯定是有效的。这是一个扩展方法,所以调用它你只需将方法放在一个静态类中并执行如下操作:

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

                  【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                  • 好吧,不幸的是,计算机程序需要尽可能通用才能最有用……或者“可编程”,这意味着程序需要接受你扔给它的任何输入.
                  猜你喜欢
                  • 1970-01-01
                  • 2012-10-06
                  • 2011-02-25
                  • 2011-12-24
                  • 2016-05-08
                  • 1970-01-01
                  • 2018-12-24
                  • 2011-04-06
                  • 2013-09-03
                  相关资源
                  最近更新 更多