我尝试GET在jQuery AJAX请求中发送请求。
GET
$.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.
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.
我尝试了所有操作,从使用AJAX而不是jQuery 添加header : {}定义到AJAX请求,甚至设置dataType为,甚至下载了一个启用CORS的插件-但没有任何帮助。JSONP``text/plain
header : {}
dataType
JSONP``text/plain
如果我尝试访问任何其他站点,也会发生同样的情况。
有任何适当且简单解决方案的想法吗?有没有?
这是设计使然。您不能使用XMLHttpRequest向另一台服务器发出任意HTTP请求,除非该服务器通过为请求主机放置Access-Control- Allow-Origin标头来允许它。
https://developer.mozilla.org/zh- CN/docs/Web/HTTP/Access_control_CORS
您可以在script标记中检索它(对脚本,图像和样式表没有相同的限制),但是除非返回的内容是脚本,否则它不会给您带来什么好处。
这是有关CORS的教程:
http://www.bennadel.com/blog/2327-cross-origin-resource-sharing-cors-ajax- requests-between-jquery-and-node- js.htm
这样做都是为了保护最终用户。假设一个图像实际上是一个图像,一个样式表只是一个样式表,而一个脚本只是一个脚本,向另一台服务器请求这些资源并不会真正造成任何危害。
但总的来说,跨域请求可能会做的不好。假设您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);
当然,此方法可能会遇到其他问题:
我敢肯定还有其他人。但是,如果所有这些问题都不能阻止它,那么第三种方法可能会很好地工作。