创建 SEO 友好的 URI 字符串的最佳方法

Posted

技术标签:

【中文标题】创建 SEO 友好的 URI 字符串的最佳方法【英文标题】:Best way to create SEO friendly URI string 【发布时间】:2011-06-02 15:13:55 【问题描述】:

该方法应该只允许在 URI 字符串中使用“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-”字符。

制作漂亮的 SEO URI 字符串的最佳方法是什么?

【问题讨论】:

这听起来是个糟糕的主意。请考虑使用encoding the URL。 @marcog:这听起来很像 SO 从标题生成对 SEO 友好的 URL。请注意,我很想用一个连字符替换所有非 alnum 字符序列;相同的一般效果(如果在极端情况下可能略有不同)但更容易理解。 @Donal 哦,对。不过,您肯定会从允许的字符集中生成一个随机字符串吗? @marcog:SO 所做的是将那部分(实际上无关紧要)放在 URL 的末尾;之前的路径片段是一个 ID,它是实际定位问题的位置。为此使用用户输入是安全的,因为清理是根据严格的字符白名单定义的。 (随机字符串?这是从哪里来的?) @Donal 好的,我明白你指的是什么。我以为你的意思是ID,例如4581025 这个问题。感谢您的澄清! 【参考方案1】:

如果您想搜索更多信息,这些通常称为“slug”。

您可能想查看其他答案,例如 How can I create a SEO friendly dash-delimited url from a string? 和 How to make Django slugify work properly with Unicode strings?

它们涵盖 C# 和 Python 而非 javascript,但对 slug 约定和您在制作它们时可能面临的问题(例如唯一性、unicode 规范化问题等)进行了一些与语言无关的讨论。

【讨论】:

【参考方案2】:

这是普遍共识:

    Lowercase 字符串。

    string = string.toLowerCase();
    

    Normalize所有字符并去掉所有diacritical marks(这样例如é、ö、à变成e、o、a)。

    string = Normalizer.normalize(string, Form.NFD).replaceAll("\\pInCombiningDiacriticalMarks+", "");
    

    Replace all- 剩余的非字母数字字符并在必要时折叠。

    string = string.replaceAll("[^\\pAlnum]+", "-");
    

所以,总结一下:

public static String toPrettyURL(String string) 
    return Normalizer.normalize(string.toLowerCase(), Form.NFD)
        .replaceAll("\\pInCombiningDiacriticalMarks+", "")
        .replaceAll("[^\\pAlnum]+", "-");

【讨论】:

还建议删除前导和尾随标点符号。 // 删除结尾标点符号 .replaceAll("[^a-z0-9]+$", "") // 删除开头标点符号 .replaceAll("^[^a-z0-9]+", ""); 【参考方案3】:

以下正则表达式将与您的算法执行相同的操作。我不知道图书馆会做这种事情。

字符串 s = 输入 .replaceAll(" ?- ?","-") // 删除连字符周围的空格 .replaceAll("[ ']","-") // 把空格和引号变成连字符 .replaceAll("[^0-9a-zA-Z-]",""); // 删除不在我们允许的字符集中的所有内容

【讨论】:

以上是关于创建 SEO 友好的 URI 字符串的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串创建 SEO 友好的破折号分隔 url?

如何制作seo友好的AMP页面查询字符串

301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL

seo 友好的 url 使用西里尔字符 х 字符,它总是得到 404。如何修复它?

PHP 将字符串转换为孟加拉语语言类型的 SEO 友好 URL

使用 Codeigniter 重定向 SEO 友好的 url?