Ich habe viel über den Fehler 'Access-Control-Allow-Origin' gelesen, verstehe aber nicht, was ich beheben muss :(
Ich spiele mit der Google Moderator-API, versuche jedoch neue Serie hinzufügen Ich erhalte:
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.
Ich habe versucht, mit und ohne Rückrufparameter 'Access-Control-Allow-Origin *' in den Header einzufügen. Und ich weiß nicht, wie man hier $ .getJSON verwendet, falls zutreffend, da ich den Authorization-Header hinzufügen muss und nicht weiß, wie ich es ohne beforeCall von $ .ajax machen soll: /
Gibt es Licht für diese Dunkelheit?
Das ist der Code:
<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 -->
Ich habe den Access-Control-Allow-Origin-Fehler behoben, bei dem der dataType-Parameter in dataType: 'jsonp' geändert und ein crossDomain: true hinzugefügt wurde
$.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
});
Ich hatte genau das gleiche Problem und es war nicht domänenübergreifend, sondern die gleiche Domain. Ich habe diese Zeile gerade zu der PHP-Datei hinzugefügt, die die Ajax-Anfrage bearbeitet hat.
<?php header('Access-Control-Allow-Origin: *'); ?>
Es wirkte wie ein Zauber. Vielen Dank an das Plakat
Ja, in dem Moment, in dem jQuery erkennt, dass die URL zu einer anderen Domain gehört, wird davon ausgegangen, dass es sich um einen domänenübergreifenden Aufruf handelt. Daher ist crossdomain:true
Hier nicht erforderlich.
Beachten Sie auch, dass Sie mit $.ajax
Keinen synchronen Anruf tätigen können, wenn Ihre URL zu einer anderen Domain (Cross-Domain) gehört oder Sie JSONP verwenden. Es sind nur asynchrone Anrufe zulässig.
Hinweis: Sie können den Service synchron aufrufen, wenn Sie bei Ihrer Anfrage async:false
Angeben.
Wenn Sie bei dem Versuch, einen Dienst zu nutzen, bei dem Sie den Header Access-Control-Allow-Origin *
In dieser Anwendung nicht hinzufügen können, dem Server jedoch einen Reverse-Proxy vorlegen können, kann der Fehler durch ein erneutes Schreiben des Headers vermieden werden.
Angenommen, die Anwendung wird auf dem Port 8080 ausgeführt (public domain unter www.mydomain.com ), und Sie haben den Reverse-Proxy auf demselben Host am Port abgelegt 80, dies ist die Konfiguration für Nginx Reverse Proxy:
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 *;
}
}
In meinem Fall verursacht der Subdomainname das Problem. Hier sind Details
Ich benutzte app_development.something.com
, hier unterstrichen (_
) Subdomain erzeugt CORS-Fehler. Nach dem Ändern von app_development
bis app-development
es funktioniert gut.