如何使参数化的Express路线有或没有尾部反斜杠?
我有一个非常简单的应用程序,将始终使用以下URL结构进行访问: www.myapplication.com/some/deep/nested/1234567890/
1234567890是用户的帐号,每个用户可能不同。 目前,如果最后一个反斜杠停止,则无法访问应用程序: www.myapplication.com/some/deep/nested/1234567890
实际上,如果通过以下方式访问应用程序,url将发生变化: www.myapplication.com/1234567890
鉴于以下在我的app.js中:
app.use('/', api); app.use('/:user', express.static(path.join(__dirname, 'dist')));
在哪里api是一个简单的快速路由器本身,我的React应用使用jQuery使用req.params中的用户号码调用,我怎样才能让应用程序访问使用后面的反斜杠或不?
我已经尝试了各种方法,如:
app.use('/:user/?', express.static(path.join(__dirname, 'dist')));
要么
app.use(express.static(path.join(__dirname, 'dist')));
后者阻止url被截断,但只能在没有用户帐号的情况下工作,这显然是必要的: www.myapplication.com/some/deep/nested/
如果我访问www.myapplication.com/some/deep/nested/1234567890
或www.myapplication.com/some/deep/nested/1234567890/
URL不被截断,但我得到Cannot GET /1234567890
或Cannot GET /1234567890/
。
我也试过洗牌,无济于事:
app.use('/:user', express.static(path.join(__dirname, 'dist'))); app.use('/', api);
我使用快速斜杠 。 这是一个简单的中间件,当它不存在时附加一个斜线。 那么你只需要处理包含尾部斜线的路线。 这可能是可取的,因为www.myapplication.com/some/deep/nested/1234567890
和www.myapplication.com/some/deep/nested/1234567890/
是不同的path,并且为两者提供相同的响应并不理想(在SEO的条款,最有针对性的)。
那么,我想出了一个hacky,work-around的方式来做到这一点,是非常特定于我的情况,并不会在大多数情况下工作。 我会在这里发表,以便其他人可以改善答案。 我添加了以下中间件:
app.use('/', api); app.use(function(req, res, next) { if(req.url.substr(-1) !== '/' && req.url.length > 1 && req.url.substr(-3) !== 'css' && req.url.substr(-2) !== 'js'){ res.redirect(301, '/some/deep/nested' + req.url + '/'); }else{ next(); } }); app.use('/:user', express.static(path.join(__dirname, 'dist')));
if语句检查css和js文件,并防止反斜杠被添加到它们(在添加这些检查之前我看到的问题)。
再一次,这适用于我面对的具体情况,但我希望有更好的答案潜伏在那里。