为了账号安全,请及时绑定邮箱和手机立即绑定

HTTP 重定向循环 Node/Express

HTTP 重定向循环 Node/Express

FFIVE 2023-11-02 21:14:58
我有以下代码用于尝试将任何http流量重定向到等效的https// Add some redirect logic to ensure that https is always used in production, staging, development environmentapp.use((req, res, next) => {  // if NODE_ENV is 'local' don't redirect to https, only do so for our deployed server environments  if(!['development', 'staging', 'production'].includes(process.env.NODE_ENV)) return next()  if(!req.secure) {    return res.redirect(301, `https://${req.headers.host}${req.originalUrl}`)  }  next()})/** * Bootstrap routes */require('./routes')(app)然而,当我在浏览器中测试这个并输入类似http://example.com我在浏览器中收到重定向循环警告和我的 papertrail 日志中的内容时,我可以看到 console.log 一次又一次地触发。我在这里缺少一些简单的东西吗?任何帮助表示赞赏。
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

添加app.enable('trust proxy')修复了问题并允许上面的代码工作。同样,我正在使用 Heroku。


查看完整回答
反对 回复 2023-11-02
?
墨色风雨

TA贡献1853条经验 获得超6个赞

尝试添加:到 中的协议名称req.protocol === 'https:'。




// Add some redirect logic to ensure that https is always used in production, staging, development environment

app.use((req, res, next) => {

  console.log('here')

  // if NODE_ENV is 'local' don't redirect to https, only do so for our deployed server environments

  if(!['development', 'staging', 'production'].includes(process.env.NODE_ENV)) return next()


  // request was via https, so do no special handling

  if(req.protocol === 'https:') return next(); // <---- here, add : after https

  res.redirect('https://' + req.headers.host + req.url)

})


/**

 * Bootstrap routes

 */

require('./routes')(app)


UPD:这是因为 url 解析器返回协议为https:. 请参阅 Nodejs repl 模式的示例


$ node

> url.parse('https://ya.ru')

Url {

  protocol: 'https:',

  slashes: true,

  auth: null,

  host: 'ya.ru',

  port: null,

  hostname: 'ya.ru',

  hash: null,

  search: null,

  query: null,

  pathname: '/',

  path: '/',

  href: 'https://ya.ru/'

}

https:,而不是https像评论中提到的那样


查看完整回答
反对 回复 2023-11-02
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信