1

我正在尝试从本地主机访问 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标头仍然存在。我怎样才能删除它们?

4

3 回答 3

2

OriginRequest对象认为是不安全的标头(源代码

这就是您无法删除它们的原因;Request 实现只允许您删除或修改被认为是安全的标头。

于 2014-04-01T18:02:39.470 回答
0

Google Maps API 确实有 Access-Control-Allow-Origin。

在本地主机页面上加载 jquery 后,我可以使用下面的方法快速测试它,它可以工作。

$.getJSON("https://maps.googleapis.com/maps/api/timezone/json?location=-33.86,151.20")

于 2014-03-27T00:42:51.440 回答
0

查看维基百科mdn中的相同来源政策!

你应该使用像fiddler这样的 HTTP Sniffer来分析请求!然后你应该检查Access-Control-Allow-Origin: *标题是否存在!只有当响应中存在此标头时,您的请求才能在浏览器中工作!所以服务器,在你的情况下是谷歌服务器,必须发送它!Google 通常会在所有公共 API 上执行此操作以供浏览器内使用。因为否则无法通过 AJAX 请求直接访问此 URL。

重要的是要了解这same origin policy是出于安全原因构建的浏览器功能!因此,当您从非浏览器环境(如 node.js 或任何其他服务器端编程环境)发出请求时,它不会影响您!当您直接通过浏览器发出请求时,它也不会影响您,因为它限制了 AJAX 请求,而不是一般每个请求。

有一些方法可以绕过这个限制,所以如果你必须向不发送标头的服务器发出 AJAX 请求,Access-Control-Allow-Origin你仍然可以通过你的服务器代理请求!

另一个解决方法是JSONP,但这也支持请求的服务器!

重要说明:如果在Access-Control-Allow-Origin标头中返回一个来源而不是*请求,则只有在服务器返回的来源上才有可能!所以也许服务器正在返回生产源,但拒绝本地主机?

至少从谷歌reCAPTCHA我知道你可以将 API 密钥限制为特定的来源。出于开发目的,谷歌通常允许来自 的所有请求localhost,但可能出于任何原因而不是您的情况。检查这一点的最佳方法是使用上面所说的简单 HTTP 嗅探器分析 HTTP 流量!

于 2014-04-01T15:44:55.187 回答