Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
URL路由:创建友好URL时处理空格和非法字符_Url_Routing_Character - Fatal编程技术网

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

URL路由:创建友好URL时处理空格和非法字符,url,routing,character,Url,Routing,Character,我看到了很多关于URL路由的讨论,还有很多很棒的建议。。。但在现实世界中,有一件事我没有看到: 创建带有空格和非法字符的友好URL 查询数据库 假设您正在构建一个医疗网站,其中包含文章,其中包含类别和可选的子类别。(一对多)。(可以用任何例子,但医学领域有很多长词) 示例类别/子/文章结构: 您的一般健康状况(类别) 自然健康(子类别) 你身体的免疫系统以及为什么它需要帮助(文章) 植物和草药真的是解决办法吗 我应该吃强化食品吗 顺势疗法医学 什么是顺势疗法药物 健康饮食 你应该每天喝1

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

  • 创建带有空格和非法字符的友好URL
  • 查询数据库
  • 假设您正在构建一个医疗网站,其中包含文章,其中包含类别和可选的子类别。(一对多)。(可以用任何例子,但医学领域有很多长词


    示例类别/子/文章结构:
  • 您的一般健康状况(类别)
    • 自然健康(子类别)
    • 你身体的免疫系统以及为什么它需要帮助(文章)
    • 植物和草药真的是解决办法吗
    • 我应该吃强化食品吗
    • 顺势疗法医学
    • 什么是顺势疗法药物
    • 健康饮食
    • 你应该每天喝10杯咖啡吗
    • 有机蔬菜值得吗
    • 汉堡王®邪恶吗
    • “法式咖啡馆”还是美国咖啡更健康
  • 疾病和条件(类别)
    • 自身免疫障碍(子类别)
    • 人类的头号杀手是某种疾病
    • 如何获得帮助
    • 遗传条件
    • 怀孕前预防脊柱裂
    • 你倾向于长寿吗
  • FooBar博士的个人建议(类别)
  • 我对草药和天然药物的看法(文章-无子类别)
  • 你为什么要关心你的健康
  • 合理饮食是可能的
  • 无血手术成熟了吗

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

    此外,还有大量非法字符,如#!?'"等

    因此,问题是:
  • 你将如何处理非法字符和空格?(赞成和反对?)
  • 你能处理从数据库里得到的吗
    • 换句话说,您会信任DB查找项目,传递标题,还是拉取所有标题,并在代码中找到密钥,以获得要传递到数据库的密钥(对数据库的两次调用)

  • 注意:我总是看到一些漂亮的例子,比如/products/beverages/Short Product Name/如何处理一些丑陋的例子作为后续。我确实有一些想法。所以请随意评论这些想法或给出您自己的问题答案:

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

    • www.mysite.com/diseases---conditions/Auto-immunity 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/autoimmedisorders/thenumber1killerof people issomedisease/

    (可能无法在区分大小写的服务器上正常工作,并且难以阅读)解决方案2将是我的建议。我不是世界上最大的SEO专家,但我相信这几乎是获得好排名的“标准”方式。

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

    我的最后一种方法是:

  • 将所有“奇怪字母”转换为“普通字母”->a到a,ñ到n,等等
  • 将所有非单词字符转换为z(即非a-zA-Z0-9)
  • 将下划线组替换为单个下划线
  • 删除所有尾下划线和前导下划线

  • 至于存储,我认为友好的URL应该进入数据库,并且是不可变的,毕竟我通过在数据库中添加一列(例如:标题列旁边的URL标题)解决了这个问题并保存一个标题,去掉所有非法字符,用“&”符号替换为“and”,空格替换为下划线。然后,您可以通过URL标题进行查找,并在页面标题或任何地方使用真实的标题。

    解决方案2是这些问题的典型方法……一些改进是可能的,例如,将撇号改为空而不是空破折号,用于可读性。通常,您希望在数据库中存储标题的munged for URL validity版本以及“真实”标题,以便使用索引选择位置来选择项目

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

    但是,这取决于您的web框架。例如,基于CGI的任何东西都无法区分编码的%2F和真实的/,并且某些框架/部署可能难以使用Unicode字符

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

    /article/1/Some_Article_Title_Here
    /article/1/Section/5/Section_Title_Here
    /section/19023/Section_Title_here  ( == above link ) 
    
    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"));
    
    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"