req.url总是给我" /"无论我用什么路径

时间:2017-01-05 23:33:13

标签: javascript node.js express heroku

//Force HTTPS
if (app.get('env') == 'production'){
    app.use('*',function(req,res,next){
        if(req.headers['x-forwarded-proto']!='https') res.redirect(301, "https://" + req.host + req.url)
            /* x-forwarded-proto is used because heroku */
        else next()
    })
}
对于使用此示例的任何人

修改:,我们已弃用req.host,请务必使用req.hostname

我有一个代码块,可以将任何http请求重定向到同一页面,但使用https协议..除了使http请求始终重定向到主页外,它的工作方式非常好。我已将其追溯到req.url总是等于'/'这一事实,无论请求网址实际上是什么。

即。如果我导航到页面http://hostname.com/my/path,我希望服务器上的req.url等于"my/path/",而是等于"/"

我认为这与我用于前端的react-router或者heroku内部重定向请求的方式有关,但是我无法找到解决方案。

2 个答案:

答案 0 :(得分:0)

app.use是表达还是什么?我的猜测是,在你获得你提供的代码片段之前,你可能正在执行重定向。它可能不是react-router,因为前端的东西发生在后端返回响应之后(意味着req.url不应该受到react-router的影响,因为react-router会在以后出现)

答案 1 :(得分:0)

将函数挂载到app.use()的路径,通过从中删除挂载点部分来重写req.url。您应该使用req.originalUrl代替或省略路径参数:

app.use(function (req, res, next) {
  // req.url not changed as path is not specified
});

app.use('/foobar', function (req, res, next) {
  // foobar removed from the req.url
});

app.use('*', function (req, res, next) {
  // everything (*) removed from the req.url
  // original URL available in req.originalUrl
});