【问题标题】:Confused on why I am getting a Cross-Origin Request Blocked error对为什么我收到跨域请求被阻止错误感到困惑
【发布时间】:2016-11-24 07:09:39
【问题描述】:

我知道有几篇关于这个主题的帖子,但我有点困惑为什么我会收到“跨源请求被阻止:同源策略不允许读取http://ipaddress/json 的远程资源。这可以是通过将资源移动到同一域或启用 CORS 来修复。”我正在尝试访问的 Rest API 当前位于 IP 地址为 xyz 的设备上。这个 Rest API 是我用 C 开发的 CGI 脚本。

现在,我运行此代码的设备也连接到同一个 Wifi,IP 地址为 xyz。那么这是否意味着资源不是远程的,因为它在同一个域下?

这是我的 JavaScript 代码,以防有人好奇。

<button id="submit" onclick="fun()">Click here!</button>

<script language="JavaScript" type="text/javascript" src="jquery-3.1.0.min.js"></script>
<script>
function fun()
{
  $.getJSON('http://ipaddress/json', function(data) 
{
    alert(data.toSource());
    console.log(data);
});
}
</script>

我不一定要求解决这个问题,因为我知道网上有很多,但我更好奇为什么我会遇到这个问题以及我对这个错误的理解有什么错误。我还尝试了其他几个公共 JSON 站点:

使用https://api.github.com/users/mralexgray/repos没有导致这个错误,返回了正确的信息。

但是,使用https://puppygifs.tumblr.com/api/read/json 确实会导致此错误。我假设这可能是因为 GitHub 将 CROS 添加到他们的服务器?

任何理解将不胜感激。

【问题讨论】:

  • 您可以自己简单地验证一下。在 firefox 中使用 httpfox 之类的东西来查看从浏览器到指定站点的请求,并在尝试 ajax 调用时查看OPTIONS 请求回复的样子(如果有的话)。
  • 当 CORS 规范说“同域”时,意味着// 之后的整个名称必须与来源相同。在同一个网络上,或具有相同的域后缀是不够的。 foo.domain.combar.domain.com 不是同一个域,192.168.2.10192.168.2.20 也不是。
  • 如果你有一个有线调制解调器,你的公共 IP 和你邻居的 IP 除了最后几个数字外可能相同。你真的会因为他们使用同一家有线电视公司就认为他们在同一个域中吗?

标签: javascript jquery json dns cross-domain


【解决方案1】:

要同源,URL 必须具有相同的协议(例如“http”)、相同的端口和相同的域。如果您在 URL 中使用直接 IP 地址而不是域,则它必须具有相同的 IP 地址。

您在同一个 WiFi 或同一个本地网络上并不重要。重要的是运行 Javascript 的网页的 URL 的来源与您进行 Ajax 调用的 URL 的来源相比。

如果您是同一来源,则请求将在服务器上未启用 CORS 的情况下工作。

如果您不是同一个来源,则服务器必须在浏览器允许 Ajax 调用之前启用 CORS。

如果您看到特定的跨源 ajax 调用有效,那么这些目标服务器必须启用了 CORS。


底线:如果您尝试使用 ajax 调用访问您自己的 CGI 脚本,并且您在 URL 中使用 IP 地址,并且执行 Ajax 调用的网页确实也不是来自同一个 IP 地址,那么您需要在 CGI 脚本中添加 CORS 支持,以便浏览器允许发出请求。

或者,将您的 CGI 移动到与网页相同的 IP 地址。

【讨论】:

  • 好吧,那就更有意义了。是的,这两个 IP 地址确实不同,所以我将继续将 CORS 添加到我的 CGI 脚本中。仅将 CORS 添加到我的 CGI 脚本就足够了,还是我还需要将 CORS 支持添加到我正在使用的 Web 服务器(NGINX)。此外,不确定您是否知道这个问题的答案,但是否像 printf("Access-Control-Allow-Origin: *"); 一样简单地将 CORS 支持添加到 C 中的 CGI 脚本?谢谢你的解释!
  • @trynacode - 您不需要网页来源的服务器上的 CORS 支持,只需要进行 Ajax 调用的服务器上。可能比您建议的 CORS 支持涉及更多(这取决于您的 ajax 调用)。关于该主题的文章有数千篇,因此您应该能够通过 Google 找到正确的指导。根据您的特定 Ajax 调用,除了 GET 之外,您可能还需要实现对 OPTIONS 命令的支持,因为浏览器可能在 GET 之前使用 OPTIONS - 取决于特定的 Ajax 调用。
猜你喜欢
  • 2015-02-04
  • 2015-06-08
  • 2015-05-05
  • 2022-07-18
  • 2021-12-02
  • 2017-12-19
  • 2020-11-03
  • 2013-01-20
  • 2021-06-26
相关资源
最近更新 更多