【问题标题】:How to remove request headers in HTTPS npm module如何在 HTTPS npm 模块中删除请求标头
【发布时间】:2014-03-23 17:28:51
【问题描述】:

我从本地主机试图访问谷歌API。 Chrome的说,这是不可能的,因为原产地 P>

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请求。 P>

   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头仍然存在提出这个要求的时候。如何删除它们?

【问题讨论】:

  • 铬抱怨的响应报头,而不是一个请求报头。关闭这些请求头将不会帮助(我不认为它可能)。 SPAN>
  • @ AaronDufour但为什么当我贴在Chrome GET链接一切正常?它返回我有效的JSON。我想从我的代码获得相同的JSON。 SPAN>
  • 上AJAX请求有浏览器的执行限制,以防止数据窃取。例如,如果你登录到Gmail和其他应用程序发出GET请求时,它会与您的Cookie发送,然后它们会得到您的电子邮件!因此,服务器必须按顺序从其他领域AJAX请求发送Access-Control-Allow-Origin头被允许获得数据。我想到的是,Maps API是不应该这样使用 - 您应该咨询自己的文档产品的正确使用 SPAN>
  • @ AaronDufour有什么区别,如果我部署和启动从生产服务器相同的代码?看来,问题只在很奇怪我“localhost”的域名。为什么我不能从本地主机测试API访问? SPAN>
  • 它不会在生产工作,无论是。问题不域是localhost,其从所述AJAX请求的域其不同的(即,其不maps.googleapis.com)。跨度>

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


【解决方案1】:

OriginRequest 对象 (source code) 视为不安全的标头

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      查看wikipediathe mdn 中的同源策略!

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

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

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

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

      重要提示: 如果在Access-Control-Allow-Origin 标头中返回一个来源而不是*,则只有当您位于服务器返回的来源上时,该请求才有可能!那么也许服务器正在返回生产源,但拒绝本地主机?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 2016-12-28
        • 2012-01-30
        相关资源
        最近更新 更多