我正在使用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。但显然事实并非如此。这有什么不对?
答案 0 :(得分:1)
我认为你实际上没有SSL证书? Heroku将提供HTTPS,但是当它到达您的快速端点时,它会在内部将其转换为普通HTTP,这就是它将req.protocol
视为HTTP的原因。
甚至提供getJSON
的网址有什么意义吗?为什么不发送它$.getJSON('/about', callback)
并让浏览器处理它?</ p>
此外,您还没有在您上传的第一张图片中隐藏您的网址,如果这是您想要的内容。
答案 1 :(得分:1)
Heroku路由器正在进行SSL终止,因此无论您是通过http还是https连接,都可以获得http。但是,在X-Forward-Proto
标头中设置了原始协议。您需要使用此值。