2

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

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

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

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

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

我错过了什么吗?

4

3 回答 3

6

现在可以在括号内放一个斜杠作为路由的可选部分:

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

来自关于 Backbone 路由末尾的斜线主题的非常全面的问题线程

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

于 2013-11-21T15:50:18.167 回答
0

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

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

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

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

于 2013-01-25T16:45:49.057 回答
0

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

于 2013-01-26T04:11:42.970 回答