【问题标题】:NodeJS: Send HTTPS request but get HTTPNodeJS:发送 HTTPS 请求但获得 HTTP
【发布时间】:2017-08-02 16:26:18
【问题描述】:

我正在使用 NodeJS 构建一个网站,并将其部署到 Heroku。但是当我打开网站时,出现了问题。问题来了:

代码: 在我的网站的主要源文件中:

app.get('/', (req, res) => {
    var data = {
        rootURL: `${req.protocol}://${req.get('Host')}`,
    };

    res.render('home.html', data);
});

然后,在 home.html 中,我包含以下脚本:

<script type="text/javascript">
    $.getJSON('{{rootURL}}'+'/about', {}, function(data){
        // Code here is deleted for now.
    }).fail(function(evt) {
        // Code here is deleted for now.
    });
</script>

这里我使用 hbs 模板,因此 {{rootURL}} 等于与 'home.html' 页面一起呈现的 'data' 对象中的 'rootURL' 属性。 '/about' 是我为我的网站设计的 API 之一。它基本上会发回一些关于网站本身的信息,并且这些信息被包裹在 JSON 中。

那么,问题来了。该代码在本地运行良好,当我向 Heroku 发送 HTTP 请求而不是 HTTPS 时运行良好。但如果我向 Heroku 发送 HTTPS 请求,我会收到“混合内容”错误: Errors I get in Chrome Console.

然后我切换到开发人员工具中的“元素”选项卡,我看到了这个: The schema is HTTP, not HTTPS!

我在这里很困惑。我只是在 'req' 对象中获取 'protocol' 属性,然后用它填充模板。所以,我假设如果我在 Chrome 浏览器中输入 '[my-website-name].herokuapp.com' 和 'https' 架构,我部署在 Heroku 上的 nodeJS 应用程序应该会得到 'https'对于 req.protocol。但显然情况并非如此。这里有什么问题?

【问题讨论】:

    标签: javascript node.js express heroku


    【解决方案1】:

    我假设您实际上没有 SSL 证书? Heroku 将提供 HTTPS,但是当它到达您的 express 端点时,它会在内部将其转换为普通 HTTP,这就是为什么它将 req.protocol 视为 HTTP。

    提供getJSON 的网址有什么意义吗?为什么不直接发送$.getJSON('/about', callback) 让浏览器处理呢?

    另外,如果这是你想要的,你没有在你上传的第一张图片中隐藏你的 URL。

    【讨论】:

    • 谢谢!真的很欣赏!是啊,你说得对。在那里使用完整的 URL 是没有意义的。而且第一张图片中的网址不是我想要的......
    【解决方案2】:

    Heroku 路由器正在执行 SSL 终止,因此无论您是通过 http 还是 https 连接,您都会获得 http。然而,原始协议设置在 X-Forward-Proto 标头中。你需要使用这个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-03
      • 2018-07-07
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      相关资源
      最近更新 更多