NodeJS路由有或没有文件扩展名

时间:2016-02-18 07:23:18

标签: javascript regex node.js express

使用以下路线:

app.get('/', controller.web.Home);

我如何在'/'内添加允许匹配//index/index.html的内容?我还想对所有其他路由使用此方法,以便用户在将.html添加到路径时看不到错误页面。

我在Express网站上看到了这一点,但是对于匹配倍数没有明确的解释。提前谢谢。

4 个答案:

答案 0 :(得分:5)

Express使用path-to-regex来表示路由字符串,这意味着您可以使用正则表达式或字符串模式来匹配路由。

  

我如何在'/'内添加允许匹配/,/ index和/index.html的内容

这样的事情会起作用:

app.get('/|index|index.html', controller.web.Home);
  

我还想对所有其他路由使用此方法,以便在将.html添加到路径时用户不会看到错误页面。

您还可以编写一个小辅助函数来处理任何路径:

function htmlExt(route) {
  return route + '|' + route + '.html';
}

并将它用于任何路线:

app.get(htmlExt('index'), controller.web.Home);
app.get(htmlExt('blog'), controller.web.Blog);
// ...

其他方法

您也可以传入一系列路径,这样也应该有效:

function htmlExt(route) {
  return [route, route + '.html'];
}
app.get(htmlExt('index'), controller.web.Home);

另一种方法是使用正则表达式。也许是接受路线和可选.html分机的人:

app.get(/index(.html)?/, controller.web.Home);

您可以在Express Routing docs中找到其他有用的示例。

答案 1 :(得分:2)

您可以将路径数组定义为第一个参数:

app.get(['/', '/index' , '/index.html'], controller.web.Home);

答案 2 :(得分:0)

使用express 4.x

app.get('/(index*)?', controller.web.Home);

参考 http://expressjs.com/en/guide/routing.html

答案 3 :(得分:0)

如果您想要全局方法,可以使用中间件功能。把它放在你所有的路线之前。

app.use(function(req, res, next) {
    var match = req.path.match(/(.*)\.html$/)
    if (match !== null) {
        res.redirect(match[1]);
    } else {
        next();    
    }
});

它将以.html结尾的每个路径重定向到没有此扩展名的路由。 当然路线路径' /'需要单独处理。