在Backbone路由中匹配空路由和尾部斜杠?

时间:2013-01-25 15:09:06

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

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

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

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

请注意,第二条和第三条路线会导致同样的事情。

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

我错过了什么吗?

3 个答案:

答案 0 :(得分:6)

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

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或其他服务器配置中路径末尾的斜杠。

答案 1 :(得分:0)

它始终与空白路线匹配而不是匹配,因为您可能无法使用Backbone.history.start启动{ pushState: true },因此请按此Backbone.history.start({pushState: true });

启动

如果您希望路线与以/结尾的任何内容匹配,则可以使用*splat并以/结束。这样的事情应该有效:

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

确保虚拟路线是最后一个。否则,虚拟路线将在您的订单之前与斜线相匹配。

答案 2 :(得分:0)

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