对我收到跨源请求阻止错误的原因感到困惑

时间:2016-07-20 21:58:58

标签: javascript jquery json dns cross-domain

我知道有几个关于这个主题的帖子,但我有点困惑为什么我得到“跨源请求被阻止:同源策略不允许在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添加到他们的服务器?

任何理解都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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