我正在创建一个与Node.js和Express的web应用程序。当我尝试将我的项目上传到Heroku时,我的所有内容都成功加载到页面上,但是当我尝试执行任何需要对我正在使用的API进行AJAX调用的操作时,我得到一个错误:
混合内容:页面在"https://farmers-market-finder.herokuapp.com/"通过HTTPS加载,但是请求了一个不安全的XMLHttpRequest端点http://search.ams.usda.gov/farmersmarkets/v1/data.svc/zipSearch?zip=94118。此请求已被阻止;内容必须通过HTTPS提供。
我正在使用美国农业部制作的农贸市场数据API,并遵循他们建议的RESTful AJAX请求格式:
$.ajax({
type: 'GET',
url: 'http://search.ams.usda.gov/farmersmarkets/v1/data.svc/mktDetail?id=' + id,
async: false,
success: function (data) { ... }
})
我在Stack Overflow和其他网站上做了很多关于这个混合内容错误的研究。大多数答案表明,"GET"请求路由需要更改为"https://...",以便在Heroku的https服务器上工作。我试着切换这个,但路由到API不再工作;我得到一个404未找到错误。我还尝试切换我的路由到一个相对链接(只是写url: '//search.ams…'),但得到了相同的404错误。似乎我真的需要一个http://链接,以达到我试图访问的API。有没有人知道一种方法让Heroku允许我使用"http"链接,而不是https,或者其他一些方式来成功地发出请求?
在server.js文件中,将这段代码添加到其他app.use语句之上。(App = expr
app.use(function (req, res, next){
if (req.headers['x-forwarded-proto'] === 'https') {
res.redirect('http://' + req.hostname + req.url);
} else {
next();
}
});