访问控制 – 允许 – 来源错误发送到Google API的jQuery邮政

我读了很多“访问控制允许来源”错误,但我不明白我必须解决:(

我正在玩Google Moderator API,但是当我尝试添加新的系列时,我收到:

XMLHttpRequest cannot load https://www.googleapis.com/moderator/v1/series?key=[key] &data%5Bdescription%5D=Share+and+rank+tips+for+eating+healthily+on+the+cheaps! &data%5Bname%5D=Eating+Healthy+%26+Cheap &data%5BvideoSubmissionAllowed%5D=false. Origin [my_domain] is not allowed by Access-Control-Allow-Origin. 

我尝试使用和不使用callback参数,我试图添加“访问控制允许来源*”标题。 我不知道如何使用$ .getJSON这里,如果适用,因为我必须添加授权标题,我不知道如何做到这一点没有beforeCall从$ .ajax:/

这乌黑的光是什么?

这是代码:

 <script src="http://www.google.com/jsapi"></script> <script type="text/javascript"> var scope = "https://www.googleapis.com/auth/moderator"; var token = ''; function create(){ if (token == '') token = doCheck(); var myData = { "data": { "description": "Share and rank tips for eating healthily on the cheaps!", "name": "Eating Healthy & Cheap", "videoSubmissionAllowed": false } }; $.ajax({ url: 'https://www.googleapis.com/moderator/v1/series?key='+key, type: 'POST', callback: '?', data: myData, datatype: 'application/json', success: function() { alert("Success"); }, error: function() { alert('Failed!'); }, beforeSend: setHeader }); } function setHeader(xhr) { xhr.setRequestHeader('Authorization', token); } function doLogin(){ if (token == ''){ token = google.accounts.user.login(scope); }else{ alert('already logged'); } } function doCheck(){ token = google.accounts.user.checkLogin(scope); return token; } </script> ... ... <div data-role="content"> <input type="button" value="Login" onclick="doLogin();"> <input type="button" value="Get data" onclick="getModerator();"> <input type="button" value="Create" onclick="create();"> </div><!-- /content --> 

我解决了access-control-allow- origin错误,修改dataType参数为dataType:'jsonp',并添加一个crossDomain:true

 $.ajax({ url: 'https://www.googleapis.com/moderator/v1/series?key='+key, data: myData, type: 'GET', crossDomain: true, dataType: 'jsonp', success: function() { alert("Success"); }, error: function() { alert('Failed!'); }, beforeSend: setHeader }); 

我有完全相同的问题,它不是跨域,但相同的域名。 我只是将这一行添加到正在处理ajax请求的php文件中。

 <?php header('Access-Control-Allow-Origin: *'); ?> 

它像一个魅力工作。 感谢海报

如果在尝试使用无法在该应用程序中添加标题Access-Control-Allow-Origin *的服务时出现此错误,但可以在服务器前放置反向代理,则可以避免使用标题改写。

假设应用程序运行在端口8080( http://www.mydomain.com上的公共域)上,并且您将反向代理放置在端口80上的同一个主机上,这是Nginx反向代理的configuration:

 server { listen 80; server_name www.mydomain.com; access_log /var/log/nginx/www.mydomain.com.access.log; error_log /var/log/nginx/www.mydomain.com.error.log; location / { proxy_pass http://127.0.0.1:8080; add_header Access-Control-Allow-Origin *; } } 

是的,当jQuery看到URL属于一个不同的域时,它假定这个调用是一个跨域调用,因此crossdomain:true在这里是不需要的。

此外,重要的是要注意,如果您的URL属于不同的域(跨域)或者您正在使用JSONP,则无法使用$.ajax进行同步调用。 只允许asynchronous调用。

注意:如果在请求中指定async:false ,则可以同步调用该服务。

在我的情况下,子域名导致了这个问题。 这里是细节

我用app_development.something.com ,这里下划线( _ )子域正在创buildCORS错误。 将app_development更改为app-development它工作正常。