8

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

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

假设您正在构建一个 Medical 站点,其中包含带有Category和可选Subcategory的文章。(1对许多)。(可以用任何例子,但医学领域有很多长词


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

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

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

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

所以,问题是:

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

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

4

11 回答 11

4

我的最后一种方法是:

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

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

于 2008-11-05T21:34:58.783 回答
4

_如果您要删除空格,出于可读性原因,我自己更喜欢 _ (您在其上加上下划线并且's 实际上是 go_away )。

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

ü -> 你

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

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

此外,严重的hericichial性质只会使人类的可用性变差。人类讨厌长网址。复制粘贴它们很糟糕,而且它们更容易破裂。如果您可以将其细分为较低的teir,即

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

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

于 2008-11-05T22:02:43.437 回答
1

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

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

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

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

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

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

于 2008-11-05T21:45:20.150 回答
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/
于 2008-11-07T09:00:22.517 回答
1

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

于 2008-11-07T21:53:34.753 回答
0

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

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

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

于 2008-11-05T21:17:10.270 回答
0

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

于 2008-11-05T21:25:48.223 回答
0

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

于 2008-11-05T21:27:10.233 回答
0

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

于 2008-11-05T21:35:38.533 回答
0

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

于 2008-11-05T21:49:51.873 回答
0

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

于 2009-05-30T09:31:45.637 回答