ExpressJS 节点 HTTPS 服务器上的 Heroku 错误 H13

Posted

技术标签:

【中文标题】ExpressJS 节点 HTTPS 服务器上的 Heroku 错误 H13【英文标题】:Heroku Error H13 on ExpressJS Node HTTPS Server 【发布时间】:2012-07-14 05:06:36 【问题描述】:

我正在尝试在我的 Node.js 服务器(Expressjs 框架)上实现 HTTPS。我有我的签名证书和密钥,以及用于测试/开发的自签名证书/密钥:

if(process.env.NODE_ENV == 'production')
  var app = module.exports = express.createServer(
    key: fs.readFileSync('./ssl/nopass_server.key'),
    cert: fs.readFileSync('./ssl/server.crt')
  );
 else 
  var app = module.exports = express.createServer(
    key: fs.readFileSync('./ssl/self_signed/nopass_server.key'),
    cert: fs.readFileSync('./ssl/self_signed/server.crt')
  );

我还在 Heroku 上设置了 SSL 端点。 localhost 上一切正常,Endpoint 似乎工作正常,但是当我在生产环境(在 Heroku 上)运行应用程序时,我收到 H13 应用程序错误。有趣的是(或不是),如果我告诉 express 创建一个 HTTP 服务器:var app = module.exports = express.createServer() 它可以工作,但是 Chrome 会抱怨 the page at https://mydomain.com ran insecure content from http://mydomain.com

我可以不/不应该在 express 中创建 HTTPS 服务器以用于生产吗?如果我应该这样做,是否需要额外的东西才能让它在 Heroku 上工作(例如,我相信它可以使用var port = process.env.PORT 设置正确的端口)?如果没有,如果它没有运行 https 服务器,我如何提供“安全”内容,这样浏览器就不会抱怨?

我正在使用以下内容来处理任何非 https 请求:

app.get('*',function(req,res,next)
  if(req.headers['x-forwarded-proto'] != 'https')
    res.redirect('https://mydomain.com'+req.url);
   else next();
);

这目前位于我其余路线的上方,这可能是问题/应该在其他地方吗?

总的来说,我对 https 的经验非常有限,所以我可能遗漏了一些明显的东西。

【问题讨论】:

【参考方案1】:

SSL 终止发生在 Heroku 的负载平衡器上;它们向您的应用发送纯(非 SSL)流量,因此您的应用应创建非 HTTPS 服务器。至于the page at https://mydomain.com ran insecure content from http://mydomain.com,请确保所有图像/脚本/等。您使用的页面也通过https 协议提供。

【讨论】:

非https,谢谢!事实证明,jquery-ui css 中的某些内容导致了警告,即使我将代码托管在我的服务器上。从 https google cdn 中提取它而不是摆脱警告。【参考方案2】:

您可以使用app.enable('trust proxy'),然后req.secure 也适用于 Heroku。

【讨论】:

以上是关于ExpressJS 节点 HTTPS 服务器上的 Heroku 错误 H13的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Swagger 开发的 NodeJS 上的 ExpressJS 框架中启用跨域资源共享 (CORS)

expressjs设置tls连接https nginx服务器请求

节点 ExpressJS |如何通过自定义查询参数验证

如何通过节点 expressjs 从 s3 提供静态网站?

使用 expressjs 3 强制 SSL

使用 Visual Studio Code 调试 ExpressJS 服务器端代码