【问题标题】:Matching an empty route and a trailing slash in Backbone route?匹配主干路由中的空路由和尾部斜杠?
【发布时间】:2013-01-25 15:09:06
【问题描述】:

我知道重复内容 (SEO) 存在一些问题,但这不是我的项目所关心的问题。

在我的主干路由器中,我有这个:

routes: {
    "": "startOrder",
    "order/:orderNumber/:stepName": "getOrder",
    "order/:orderNumber/:stepName/": "getOrder"
},

请注意,第二条和第三条路线通向同一件事。

问题是如果有人输入一个以“/”字符结尾的 URL,我希望它调用一个单独的函数(然后删除斜杠),但这不会发生,它总是匹配空白路线。然后我稍后会遇到问题,因为 URL 有一个不应该的斜杠。

我错过了什么吗?

【问题讨论】:

    标签: javascript backbone.js url-routing trailing-slash


    【解决方案1】:

    现在可以在括号中添加斜杠作为路由的可选部分:

    var Router = Backbone.Router.extend({
      routes: {
        'order/:orderNumber/:stepName(/)': 'getOrder'
      },
      // ...
    });
    

    来自pretty comprehensive issue thread on the topic of slashes at the end of Backbone routes

    但正如该线程中所指出的,为防止为您的页面记录多个 URL,最好在 Apache 或其他服务器配置中删除路径末尾的斜杠。

    【讨论】:

      【解决方案2】:

      它总是匹配空白路由而不是不匹配,因为你可能不是以{ pushState: true } 开头的Backbone.history.start,所以像这样开始Backbone.history.start({pushState: true });

      如果您想要一个匹配任何以/ 结尾的路由,您可以使用*splat 并以/ 结尾。像这样的东西应该可以工作:

      routes: {
          "": "startOrder",
          "order/:orderNumber/:stepName": "getOrder",
          "order/:orderNumber/:stepName/": "getOrder",
          "*dummy/": "endsWithSlash"
      }
      

      确保虚拟路线位于最后。否则,虚拟路线将在您的订单之前以斜线匹配。

      【讨论】:

        【解决方案3】:

        此路由在内部转换为正则表达式。你可以通过你的两种情况通过路由方法传递原始正则表达式

        【讨论】:

          猜你喜欢
          • 2017-05-04
          • 1970-01-01
          • 2014-07-09
          • 2020-03-21
          • 1970-01-01
          • 2019-01-03
          • 1970-01-01
          • 2012-04-05
          • 1970-01-01
          相关资源
          最近更新 更多