NodeJS:发送HTTPS请求但获取HTTP

时间:2017-03-12 17:01:43

标签: javascript node.js express heroku

我正在使用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'页面中呈现的'data'对象中的'rootURL'属性。 '/ about'是我为我的网站设计的API之一。它基本上发回一些关于网站本身的信息,这些信息包含在JSON中。

然后,问题来了。代码在本地工作正常,并且当我向Heroku发送HTTP请求而不是HTTPS时,效果很好。但是,如果我向Heroku发送HTTPS请求,我将收到“混合内容”错误: Errors I get in Chrome Console.

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

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

2 个答案:

答案 0 :(得分:1)

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

甚至提供getJSON的网址有什么意义吗?为什么不发送它$.getJSON('/about', callback)并让浏览器处理它?<​​/ p>

此外,您还没有在您上传的第一张图片中隐藏您的网址,如果这是您想要的内容。

答案 1 :(得分:1)

Heroku路由器正在进行SSL终止,因此无论您是通过http还是https连接,都可以获得http。但是,在X-Forward-Proto标头中设置了原始协议。您需要使用此值。