我尝试发送 GET在 jQuery AJAX 请求中请求。
$.ajax({
type: 'GET',
url: /* <the link as string> */,
dataType: 'text/html',
success: function() { alert("Success"); },
error: function() { alert("Error"); },
});
但是,无论我尝试过什么,我都得到了 XMLHttpRequest cannot load <page>. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:7776' is therefore not allowed access.
我尝试了一切,从添加 header : {}对设置 dataType 的 AJAX 请求的定义至 JSONP ,甚至 text/plain ,使用简单的 AJAX 而不是 jQuery,甚至下载启用 CORS 的插件 - 但没有任何帮助。
如果我尝试访问任何其他网站,也会发生同样的情况。
有任何合适且简单的解决方案的想法吗?到底有没有?
最佳答案
这是设计使然。您不能使用 XMLHttpRequest 向另一台服务器发出任意 HTTP 请求,除非该服务器通过为请求主机提供 Access-Control-Allow-Origin header 来允许它。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
您可以在脚本标记中检索它(对脚本、图像和样式表没有相同的限制),但除非返回的内容是脚本,否则它对您没有多大用处。
这是一个关于 CORS 的教程:
这一切都是为了保护最终用户。假设图像实际上是图像,样式表只是样式表,脚本只是脚本,从另一台服务器请求这些资源不会造成任何伤害。
但一般来说,跨域请求会做一些非常糟糕的事情。假设你,Zoltan,正在使用 coolsharks.com。还假设您已登录到 mybank.com,并且在您的浏览器中有一个 mybank.com 的 cookie。现在,假设 coolsharks.com 向 mybank.com 发送一个 AJAX 请求,要求将您所有的钱转入另一个帐户。因为您存储了 mybank.com cookie,所以他们成功完成了请求。所有这一切都是在您不知情的情况下发生的,因为没有发生页面重新加载。这是允许一般的跨站点 AJAX 请求的危险。
如果你想执行跨站请求,你有两个选择:
或
在 (1) 中,您必须与您向其发出请求的服务器合作,在 (2) 中,您必须控制最终用户的浏览器。如果您不能满足 (1) 或 (2),那您就不太走运了。
然而,还有第三种选择(由 charlietfl 指出)。您可以从您控制的服务器发出请求,然后将结果传回您的页面。例如
<script>
$.ajax({
type: 'GET',
url: '/proxyAjax.php?url=http%3A%2F%2Fstackoverflow.com%2F10m',
dataType: 'text/html',
success: function() { alert("Success"); },
error: function() { alert("Error"); }
});
</script>
然后在您的服务器上,以最简单的方式:
<?php
// proxyAjax.php
// ... validation of params
// and checking of url against whitelist would happen here ...
// assume that $url now contains "http://stackoverflow.com/10m"
echo file_get_contents($url);
当然,这种方法可能会遇到其他问题:
我敢肯定还有其他人。但是,如果这些问题都没有阻止它,那么第三种方法可能会很有效。
关于javascript - AJAX 请求获取 "No ' Access-Control-Allow-Origin' header is present on the requested resource"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35304817/