CORS-Header 'Access-Control-Allow-Origin' fehlt

72

Ich rufe diese Funktion von meinem asp.net-Formular aus auf und erhalte beim Aufrufen von ajax den folgenden Fehler in der Firebug-Konsole.

Ursprungsübergreifende Anforderung blockiert: Die gleiche Ursprungsrichtlinie verbietet das Lesen der Remote-Ressource unter http: //anotherdomain/test.json . (Grund: CORS-Header 'Access-Control-Allow-Origin' fehlt).

var url= 'http://anotherdomain/test.json';
        $.ajax({
            url: url,
            crossOrigin: true,
            type: 'GET',
            xhrFields: { withCredentials: true },
            accept: 'application/json'
        }).done(function (data) {
            alert(data);                
        }).fail(function (xhr, textStatus, error) {
            var title, message;
            switch (xhr.status) {
                case 403:
                    title = xhr.responseJSON.errorSummary;
                    message = 'Please login to your server before running the test.';
                    break;
                default:
                    title = 'Invalid URL or Cross-Origin Request Blocked';
                    message = 'You must explictly add this site (' + window.location.origin + ') to the list of allowed websites in your server.';
                    break;
            }
        });

Ich habe es anders gemacht, konnte aber immer noch keine Lösung finden.

Hinweis: Ich habe keine Serverrechte, um serverseitige Änderungen (API / URL) vorzunehmen.

immayankmodi
quelle
1
Hat anotherdomainUnterstützung JSONP? Andernfalls lesen Sie diesen doppelten Thread stackoverflow.com/questions/20035101/…
Patrick Murphy
@PatrickMurphy, nein anotherdonainunterstützt CORS nicht. Ich bekomme eine title = 'Invalid URL or Cross-Origin Request Blocked';Nachricht.
immayankmodi
Mit jsonp können Sie einen Rückrufparameter übergeben, mit dem Sie die mit json umschlossenen Daten empfangen können, ohnecors
Patrick Murphy
@PatrickMurphy, kannst du mir ein funktionierendes Beispiel zeigen? Weil ich versucht habe, war alles für mich möglich. Nicht sicher, warum es nicht funktioniert hat?
immayankmodi
Wir müssen die API kennen, mit der Sie Kontakt aufnehmen möchten. Die JSONP-Spezifikation befindet sich in der Dokumentation
Patrick Murphy,

Antworten:

63

Dies geschieht im Allgemeinen, wenn Sie versuchen, auf die Ressourcen einer anderen Domain zuzugreifen.

Dies ist eine Sicherheitsfunktion, mit der verhindert wird, dass jeder frei auf Ressourcen dieser Domain zugreifen kann (auf die beispielsweise zugegriffen werden kann, um genau dieselbe Kopie Ihrer Website in einer Piratendomäne zu haben).

Der Header der Antwort, auch wenn es 200OK ist, erlaubt anderen Ursprüngen (Domänen, Port) nicht, auf die Ressourcen zuzugreifen.

Sie können dieses Problem beheben, wenn Sie Eigentümer beider Domänen sind:

Lösung 1: über .htaccess

Um dies zu ändern, können Sie dies in den .htaccess der angeforderten Domänendatei schreiben :

    <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    </IfModule>

Wenn Sie nur einer Domain Zugriff gewähren möchten, sollte der .htaccess folgendermaßen aussehen:

    <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin 'https://my-domain.tdl'
    </IfModule>

Lösung 2: Stellen Sie die Überschriften richtig ein

Wenn Sie dies in den Antwortheader der angeforderten Datei setzen, können alle auf die Ressourcen zugreifen:

Access-Control-Allow-Origin : *

ODER

Access-Control-Allow-Origin : http://www.my-domain.com

Frieden und Code;)

grobouDu06
quelle
Hallo @ Sébastien Garcia-Roméo, ich habe das zu meinem .htaccess hinzugefügt, aber ich erhalte immer noch das gleiche Problem "Ursprungsübergreifende Anforderung blockiert: Die gleiche Ursprungsrichtlinie verbietet das Lesen der Remote-Ressource bei ...". Weißt du was das sein könnte? Vielen Dank
Jeff
Dies kann eine Menge Dinge sein ... das Beste wäre, wenn möglich, die angeforderten Medien auf demselben Server zu haben ...
grobouDu06
2
Jeff: Stellen Sie sicher, dass das Modul mod_headers in Ihrer Serverkonfiguration aktiviert ist. Wie Sie bemerkt haben, unterliegt die Antwort von gkubed einem IfModule-Test. Tatsächlich ist es am besten, es nicht in diesen Test einzuschließen. Daher wird ein Fehler ausgegeben, wenn dieses Modul auf Ihrem Server nicht verfügbar ist.
Fabien Haddadi
1
Die Betonung in der Antwort wird sehr geschätzt. Die Platzierung dieser Header auf der "angeforderten Domain" (im Gegensatz zur anderen) war der Schlüssel für mich.
Yodarunamok
1
Sollte das sein, was Correct Answerich versucht habe <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule>und es funktioniert wie ein Zauber :)
Jodyshop
6

Fügen Sie in Ihrer Ajax-Anfrage Folgendes hinzu:

dataType: "jsonp",

nach Zeile:

type: 'GET',

sollte dieses Problem lösen ..

hoffe das hilft dir

Pegasus Cozza
quelle
7
Dies ist keine garantierte Lösung und funktioniert nur , wenn die empfangende Domäne so konfiguriert ist, dass sie im JSONP-Format antwortet. Wenn für die Domäne CORS nicht aktiviert ist, ist es sehr unwahrscheinlich, dass JSONP funktioniert. Beachten Sie auch, dass JSON und JSONP nicht austauschbar sind.
Rory McCrossan
@RoryMcCrossan Wie soll die empfangende Domain auf JSONP reagieren? (Ich benutze PHP.) Ich habe ein paar Suchen durchgeführt, aber ich finde nicht viel. Ich denke, mein Problem hängt möglicherweise eher mit einer WAF (Web Application Firewall) zusammen, aber ich frage mich, ob JSONP möglicherweise eine Problemumgehung eröffnet.
PJ Brunet
3

Auf der Serverseite wird dies auf .php gesetzt:

 header('Access-Control-Allow-Origin: *');  

Sie können einen bestimmten Zugriff auf Domäneneinschränkungen festlegen:

header('Access-Control-Allow-Origin: https://www.example.com')
Ghanshyam Nakiya
quelle
2

Sie müssen Ihren serverseitigen Code wie unten angegeben ändern

public class CorsResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext,   ContainerResponseContext responseContext)
    throws IOException {
        responseContext.getHeaders().add("Access-Control-Allow-Origin","*");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");

  }
}
Ritesh Kumar
quelle
11
Oh ja, sagen Sie blind jemandem, er soll diese Einstellung in einer Produktionsumgebung aktivieren. Großartige Idee.
Magic Octopus Urn
0

Sie müssen die Idee haben, warum Sie dieses Problem bekommen, nachdem Sie die obigen Antworten durchgearbeitet haben.

self.send_header('Access-Control-Allow-Origin', '*')

Sie müssen nur die obige Zeile auf Ihrer Serverseite hinzufügen.

Raghvendra Singh
quelle