371 Stimmen

Ursprung ist nicht durch Access-Control-Allow-Origin erlaubt

Ich mache einen Ajax.request zu einem entfernten PHP-Server in einer Sencha Touch 2-Anwendung (verpackt in PhoneGap).

Die Antwort des Servers lautet wie folgt:

XMLHttpRequest kann nicht geladen werden http://nqatalog.negroesquisso.pt/login.php. Ursprung http://localhost:8888 wird von Access-Control-Allow-Origin nicht zugelassen.

Wie kann ich dieses Problem beheben?

20 Stimmen

Beim Verwenden von jQuery, sorgt dataType: 'jsonp', für den gewünschten Effekt

11 Stimmen

Übrigens ist das nicht die Antwort vom Server. Genauer gesagt wird dieser Fehler auf der Client-Seite angezeigt.

2 Stimmen

Der jsonp-Trick funktioniert wahrscheinlich nicht mehr, fyi: stackoverflow.com/questions/12216208/…

390voto

Matt Mombrea Punkte 6693

Ich habe vor einer Weile einen Artikel zu diesem Thema geschrieben, Cross-Domain-AJAX.

Der einfachste Weg, dies zu handhaben, wenn Sie die Kontrolle über den antwortenden Server haben, besteht darin, einen Antwortheader für hinzuzufügen:

Access-Control-Allow-Origin: *

Dadurch wird Cross-Domain-Ajax ermöglicht. In PHP möchten Sie die Antwort wie folgt ändern:

Sie können einfach die Header set Access-Control-Allow-Origin * Einstellung in der Apache-Konfiguration oder der htaccess-Datei platzieren.

Zu beachten ist, dass dies den CORS-Schutz effektiv deaktiviert, was sehr wahrscheinlich Ihre Benutzer Angriffen aussetzt. Wenn Sie nicht explizit wissen, dass Sie ein Platzhalterzeichen verwenden müssen, sollten Sie es nicht verwenden, sondern stattdessen Ihre spezifische Domain in die Whitelist aufnehmen:

9 Stimmen

Gibt es Sicherheitsbedenken bei dies? Diese Antwort sagt zum Beispiel, "JavaScript ist aus Sicherheitsgründen durch die "Same-Origin-Richtlinie" eingeschränkt. Beispielsweise kann ein bösartiges Skript keinen Remote-Server kontaktieren und sensible Daten von Ihrer Website senden."

4 Stimmen

Toll, ich habe gerade das in meine Node.js Server-Datei eingefügt: response.writeHead(200, { 'Content-Type': contentType, 'Access-Control-Allow-Origin': '*' }); Und es hat funktioniert. Danke!

26 Stimmen

JohnK, ja, das Platzhalterzeichen erlaubt es jeder Domain, Anfragen an Ihren Host zu senden. Ich empfehle Ihnen, das Sternchen durch eine bestimmte Domain zu ersetzen, auf der Sie Skripte ausführen möchten.

64voto

Travis Webb Punkte 14024

Wenn Sie keine Kontrolle über den Server haben, können Sie einfach dieses Argument zu Ihrem Chrome-Starter hinzufügen: --disable-web-security.

Beachten Sie, dass ich dies nicht für normales "Surfen im Internet" verwenden würde. Zur Referenz siehe diesen Beitrag: Same-Origin-Richtlinie in Chrome deaktivieren.

Wenn Sie Phonegap verwenden, um die Anwendung tatsächlich zu erstellen und auf das Gerät zu laden, wird dies kein Problem sein.

0 Stimmen

Vielen Dank. Aber meine App läuft auf mobilen Geräten, daher kann ich keine Argumente an den Webview-Wrapper übergeben.

0 Stimmen

Testest du nicht zuerst deine App im Browser? Wie debuggst du?

0 Stimmen

Ja, ich debugge in einem Chrome-Browser, aber die App läuft nicht auf Chrome. Es wird im PhoneGap-Webview ausgeführt, den ich nicht kontrollieren kann.

42voto

Reza S Punkte 8876

Wenn Sie Apache verwenden, fügen Sie einfach hinzu:

    Header set Access-Control-Allow-Origin: *

in Ihre Konfiguration. Dadurch können alle Antworten Ihres Webservers von jeder anderen Website im Internet aus abgerufen werden. Wenn Sie nur zulassen möchten, dass Dienste auf Ihrem Host von einem bestimmten Server verwendet werden, können Sie das * durch die URL des Ursprungsservers ersetzen:

Header set Access-Control-Allow-Origin: http://my.origin.host

3 Stimmen

Und vergessen Sie nicht, das Modul zu laden: a2enmod headers

0 Stimmen

Wie lädt man ein Modul:a2enmod headers?

18voto

C. Augusto Proiete Punkte 19687

Wenn Sie eine ASP.NET / ASP.NET MVC -Anwendung haben, können Sie diesen Header über die Web.config-Datei einbinden:

  ...

2 Stimmen

.NET MVC Leute, SCHAU hier! Ich werde tatsächlich eine Lösung eingeben und auf diese Antwort in meinem Blog verweisen, damit die Leute sie leichter finden können. Nichts ist schlimmer, als versuchen, eine .NET/MVC Hürde zu überwinden und nichts als PHP/jQuery-Lösungen zu finden. Danke @Caio-Proiete

1 Stimmen

Wie kommt es, dass es bei mir nicht funktioniert? Ich benutze Chrome und versuche, die Yahoo Finance Seite von meinem localhost aus aufzurufen.

1 Stimmen

Danke, es hat bei mir funktioniert. Ich habe es im Serverseitigen Code Projekt (web.config) hinzugefügt.

15voto

badMonkey Punkte 1677

Dies war die erste Frage/Antwort, die für mich aufpoppte, als ich versuchte, das gleiche Problem mit ASP.NET MVC als Datenquelle zu lösen. Mir ist bewusst, dass dies die PHP Frage nicht löst, aber es ist verwandt genug, um wertvoll zu sein.

Ich benutze ASP.NET MVC. Der Blog-Beitrag von Greg Brant hat bei mir funktioniert. Letztendlich erstellen Sie ein Attribut, [HttpHeaderAttribute("Access-Control-Allow-Origin", "*")], das Sie zu Controller-Aktionen hinzufügen können.

Zum Beispiel:

public class HttpHeaderAttribute : ActionFilterAttribute
{
    public string Name { get; set; }
    public string Value { get; set; }
    public HttpHeaderAttribute(string name, string value)
    {
        Name = name;
        Value = value;
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.AppendHeader(Name, Value);
        base.OnResultExecuted(filterContext);
    }
}

Und dann verwenden Sie es mit:

[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)
{
    return Json( "Einige öffentliche Ergebnisse" );
}

1 Stimmen

WebApi 2 hat dies jetzt integriert. asp.net/web-api/overview/security/…

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X