Heroku是如何将我的HTTP Express服务转换为HTTPS服务的?
问题解答
你遇到的情况是Heroku平台的架构设计导致的,你的Express服务本身确实是HTTP服务,能响应HTTPS请求的核心是Heroku在应用前端做了SSL终结处理,具体逻辑如下:
- Heroku在所有托管应用的入口处部署了统一的反向代理集群,默认会为所有
*.herokuapp.com后缀的域名配置免费的通配符SSL证书,用户发起的HTTPS请求会先到达这层反向代理,不会直接访问到你的Express服务。 - 反向代理层会先完成HTTPS请求的解密工作(也就是TLS终结),将解密后的普通HTTP请求转发给你运行在dyno实例中的Express服务,你的Express只需要监听端口处理HTTP请求即可,不需要自己配置SSL证书。
- 反向代理拿到Express返回的HTTP响应后,会再次加密为HTTPS响应返回给用户浏览器,所以用户侧能看到全程走的是HTTPS协议,也不会出现证书报错。
补充说明
如果你需要在Express代码中判断用户的原始请求是否为HTTPS,不能直接读取req.secure,因为反向代理转发过来的是HTTP请求,默认req.secure会一直是false。你可以通过读取请求头X-Forwarded-Proto的取值判断原始协议,也可以配置app.set('trust proxy', 1)开启Express的代理信任,之后req.secure就会正确识别用户的原始请求协议了。
内容的提问来源于stack exchange,提问作者Muhammad Siddiqui
相关产品推荐
相关产品推荐

