如何在HTTPS npm模块中删除请求标头

时间:2014-03-23 17:28:52

标签: node.js https http-headers npm request-headers

我尝试从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();

但这并没有帮助。发出此请求时,OriginReferer标题仍然存在。我该如何删除它们?

3 个答案:

答案 0 :(得分:2)

{p} OriginRequest对象视为不安全标头(source code

这就是你不能删除它们的原因;请求实现仅允许您删除或修改被认为安全的标头。

答案 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)

wikipediathe mdn中查看相同的原始政策!

你应该使用像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流量!