我尝试从localhost访问Google API。 Chrome表示,由于原产地
,这是不可能的XMLHttpRequest cannot load https://maps.googleapis.com/maps/api.... No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access.
我使用https-browserify
发出ajax请求。
options = {
hostname: "maps.googleapis.com",
port: 443,
path: "/maps/api/....",
method: "get",
headers: {
"Origin": null,
"Referer": null
}
};
result = null;
req = https.request(options, function(res) {
res.on("data", function(chunk) {
return result += chunk;
});
return res.on("end", function() {
debugger;
});
});
req.end();
但这并没有帮助。发出此请求时,Origin
和Referer
标题仍然存在。我该如何删除它们?
答案 0 :(得分:2)
答案 1 :(得分:0)
Google Maps API确实具有Access-Control-Allow-Origin。
我可以在本地主页上加载jquery之后使用下面的代码快速测试它,它可以工作。
$.getJSON("https://maps.googleapis.com/maps/api/timezone/json?location=-33.86,151.20")
答案 2 :(得分:0)
你应该使用像fiddler这样的HTTP Sniffer来分析请求!
然后你应该检查Access-Control-Allow-Origin: *
标题是否存在!只有在响应中出现此标题时,您的请求才能在浏览器中运行!所以服务器,在你的情况下谷歌服务器,必须发送它! Google通常会在所有公共API上执行此操作,以便在浏览器中使用。由于没有办法通过AJAX请求直接访问此URL。
重要的是要了解same origin policy
是出于安全原因的浏览器超级版本!因此,当您从非浏览器环境(如node.js)或任何其他服务器端编程环境发出请求时,它不会影响您!当你直接通过浏览器发出请求时,它也不会影响你,因为它是对AJAX请求的限制,而不是每个请求的通用。
有很多方法可以解决这个限制,所以如果你必须向dosnt发送Access-Control-Allow-Origin
标题的服务器发出AJAX请求,你仍然可以代理服务器的请求!
另一种解决方法是JSONP
,但这也支持所请求的服务器!
重要提示:
如果在Access-Control-Allow-Origin
标题中返回的是原点而不是*
,则只有在您访问服务器返回的原点时才能进行请求!那么也许服务器返回生产源,但是拒绝localhost?
至少来自Google reCAPTCHA
我知道您可以将API密钥限制为特定来源。出于开发目的,通常谷歌允许来自localhost
的所有请求,但可能出于任何原因而不是您的情况。检查此问题的最佳方法是使用如上所述的简单HTTP嗅探器分析HTTP流量!