NodeJS:发送HTTPS请求,但获得HTTP

我正在使用NodeJS构build一个网站,并将其部署到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”是我为我的网站devise的API之一。 它基本上发回有关网站本身的东西,这个信息被包装在JSON中。

那么,问题就来了。 该代码在本地正常工作,并且在向HTTP发送HTTP请求而不是HTTPS时运行良好。 但是,如果我向HTTPS发送HTTPS请求,则会出现“混合内容”错误: Chrome Console中出现错误。

然后,我切换到开发人员工具中的“元素”选项卡,我看到: 架构是HTTP,而不是HTTPS!

我在这里很困惑。 我只是抓住'req'对象中的'protocol'属性,并用它填充模板。 因此,假设我在我的Chrome浏览器中input“[我的网站名称] .herokuapp.com”和“https”模式 ,我部署在Heroku上的nodeJS应用程序应该为“req.protocol”获取“https”。 但显然情况并非如此。 这里有什么问题?

我假设你实际上没有SSL证书? Heroku将提供HTTPS,但是当它到达你的快速端点时,它会在内部将它翻译成正常的HTTP,这就是为什么它将req.protocol视为HTTP。

甚至提供getJSON的URL是否有任何意义? 为什么不直接发送$.getJSON('/about', callback)并让浏览器处理?

此外,您还没有在上传的第一张图片中隐藏自己的url,如果这是您的意图。

Heroku路由器正在做SSL终止,所以无论你通过http或https连接,你都会在你身边得到http。 原来的协议是在X-Forward-Proto头中设置的。 你需要使用这个值。