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

时间:2008-11-05 21:16:34

标签: url routing character

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

  1. 使用空格和非法字符创建友好网址
  2. 查询数据库
  3. 假设您正在构建一个医疗网站,其文章类别和可选的子类别。 (1对多)。 (可以使用任何示例,但医疗领域有很多长词


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

    1. 您的一般健康(类别)
      • 自然健康(子类别)
        1. 你身体的免疫系统及其需要帮助的原因。的(第)
        2. 植物和草药真的是解决方案吗?
        3. 我应该吃强化食品吗?
      • 顺势疗法
        1. 什么是顺势疗法药物?
      • 健康饮食
        1. 你每天应该喝10杯咖啡吗?
        2. 有机蔬菜值得吗?
        3. 汉堡王是邪恶的吗?
        4. “法式咖啡馆”或美式咖啡更健康吗?
    2. 疾病与疾病条件(类别)
      • 自动免疫疾病(子类别)
        1. 人的第一杀手是某种疾病
        2. 如何获得帮助
      • 遗传条件
        1. 怀孕前预防脊柱裂。
        2. 你是否倾向于活很长时间?
    3. 博士。 FooBar的个人建议(类别)
      1. 我对草药的看法&自然疗法(文章 - 没有子类别)
      2. 你为什么要关心自己的健康?
      3. 可以正确饮食并保持良好的饮食习惯。
      4. 没有不流血的手术吗?

    4. 在这样的结构中,如果你去的话,你将会有一些 LOOONG网址:  / {Category} / {subcategory} / {Article Title}

      此外,还有很多非法字符,就像#! ? 'é“等。

      SO,问题(S)是:

      1. 你会如何处理非法字符和空格? (优点和缺点?)
      2. 您是否会从数据库中获取此信息
        • 换句话说,您是否信任数据库以查找项目,传递标题,或拉出所有标题并在代码中找到密钥以获取密钥传递给数据库(两次调用数据库)?
      3. 注意:我总是看到漂亮的漂亮例子,例如/ products / beverages / Short-Product-Name /如何处理一些丑陋的例子^ _ ^

11 个答案:

答案 0 :(得分:4)

我的最后一种方法是:

  1. 将所有“奇怪的字母”转换为“普通字母” - > à到a,ñ到n等
  2. 将所有非单词字符转换为_(即不是a-zA-Z0-9)
  3. 使用单个下划线替换下划线组
  4. 删除所有拖尾和引导下划线
  5. 至于存储,我认为友好的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"));

这使我能够像这样做网址:

  • 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 /

答案 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:用破折号替换所有非法字符:

  • www.mysite.com/diseases ---条件/自动免疫疾病/的 - 1-杀手人的-此结果一些疾病/

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

解决方案#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 /

(可能在区分大小写的服务器上运行良好且难以阅读)

答案 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以外的字符。如果某些脚本需要%,?等,请更改脚本应用程序,以便它们可以使用字母数字。