it-swarm.com.de

Origin wird von Access-Control-Allow-Origin nicht zugelassen

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

Die Antwort vom Server lautet wie folgt:

XMLHttpRequest kann nicht geladen werden http://nqatalog.negroesquisso.pt/login.php . Origin http://localhost:8888 ist in Access-Control-Allow-Origin nicht zulässig.

Wie kann ich dieses Problem beheben?

328
Ricardo

Ich habe vor einiger Zeit einen Artikel zu diesem Thema geschrieben, Cross Domain AJAX .

Wenn Sie die Kontrolle über den antwortenden Server haben, können Sie dies am einfachsten tun, indem Sie einen Antwortheader hinzufügen für:

Access-Control-Allow-Origin: *

Dies ermöglicht domänenübergreifendes Ajax . In PHP möchten Sie die Antwort folgendermaßen ändern:

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

Sie können einfach die Einstellung Header set Access-Control-Allow-Origin * in die Konfigurationsdatei Apache oder die Datei htaccess einfügen.

Es sollte beachtet werden, dass dadurch der CORS-Schutz effektiv deaktiviert wird, wodurch Ihre Benutzer sehr wahrscheinlich angegriffen werden . Wenn Sie nicht wissen, dass Sie speziell einen Platzhalter verwenden müssen, sollten Sie diesen nicht verwenden und stattdessen Ihre spezifische Domain auf die Whitelist setzen:

<?php header('Access-Control-Allow-Origin: http://example.com') ?>
374
Matt Mombrea

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

Beachten Sie, dass ich dies nicht für das normale "Surfen im Internet" verwenden würde. Informationen hierzu finden Sie in folgendem Beitrag: Deaktivieren Sie dieselbe Origin-Richtlinie in Chrome .

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

62
Travis Webb

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

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

in deiner 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 den * durch die URL des Ursprungsservers ersetzen:

Header set Access-Control-Allow-Origin: http://my.Origin.Host
41
Reza S

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

<system.webServer>
  ...

    <httpProtocol>
        <customHeaders>
            <!-- Enable Cross Domain AJAX calls -->
            <remove name="Access-Control-Allow-Origin" />
            <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
    </httpProtocol>
</system.webServer>
18
Caio Proiete

Dies war die erste Frage/Antwort, die auftauchte, als ich versuchte, dasselbe Problem mit ASP.NET MVC als Datenquelle zu lösen. Mir ist klar, dass dies die Frage PHP nicht löst, aber es ist genug verwandt, um wertvoll zu sein.

Ich verwende ASP.NET MVC. Der Blogpost von Greg Brant hat bei mir funktioniert. Letztendlich erstellen Sie ein Attribut, [HttpHeaderAttribute("Access-Control-Allow-Origin", "*")], das Sie 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 benutze es dann mit:

[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)
{
    return Json( "Some public result" );
}
15
badMonkey

Da Matt Mombrea auf der Serverseite korrekt ist, kann ein anderes Problem auftreten, nämlich die Ablehnung von Whitelists.

Sie müssen Ihre phonegap.plist konfigurieren. (Ich benutze eine alte Version von Phonegap)

Bei Cordova können sich einige Änderungen in der Benennung und im Verzeichnis ergeben. Die Schritte sollten aber größtenteils gleich sein.

Wählen Sie zunächst Unterstützende Dateien> PhoneGap.plist

enter image description here

dann unter "ExternalHosts"

Fügen Sie einen Eintrag mit dem Wert " http://nqatalog.negroesquisso.pt " hinzu. Ich verwende * nur für Debugging-Zwecke.

enter image description here

10
steve0hh

Ich bin ein paar Mal darauf gestoßen, als ich mit verschiedenen APIs gearbeitet habe. Oft besteht eine schnelle Lösung darin, "& callback =?" bis zum Ende einer Zeichenfolge. Manchmal muss das kaufmännische Und ein Zeichencode sein und manchmal ein "?": "? Callback =?" (Siehe Verwendung der Forecast.io-API mit jQuery )

7

Dies kann für alle nützlich sein, die eine Ausnahme sowohl für "www" - als auch für "nicht www" -Versionen eines Empfehlers benötigen:

 $referrer = $_SERVER['HTTP_REFERER'];
 $parts = parse_url($referrer);
 $domain = $parts['Host'];

 if($domain == 'google.com')
 {
         header('Access-Control-Allow-Origin: http://google.com');
 }
 else if($domain == 'www.google.com')
 {
         header('Access-Control-Allow-Origin: http://www.google.com');
 }
7
lewsid

Ich werde Ihnen eine einfache Lösung für diese geben. In meinem Fall habe ich keinen Zugriff auf einen Server. In diesem Fall können Sie die Sicherheitsrichtlinie in Ihrem Google Chrome Browser ändern, um Access-Control-Allow-Origin zuzulassen. Das ist sehr einfach:

  1. Erstellen Sie eine Chrome Browserverknüpfung
  2. Klicken Sie mit der rechten Maustaste auf das Verknüpfungssymbol -> Eigenschaften -> Verknüpfung -> Ziel

Einfaches Einfügen in "C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security.

Der Standort kann abweichen. Öffnen Sie nun Chrome, indem Sie auf diese Verknüpfung klicken.

7
Dibish

Wenn Sie eine Chrome -Erweiterung schreiben und diese Fehlermeldung erhalten, stellen Sie sicher, dass Sie die Basis-URL Ihrer manifest.json -Erweiterung Berechtigungsblock hinzugefügt haben. Beispiel:

"permissions": [
    "https://iTunes.Apple.com/"
]
6
itzg

wenn Sie unter Apache arbeiten, fügen Sie Ihrem Verzeichnis einfach eine .htaccess-Datei mit folgendem Inhalt hinzu:

Header set Access-Control-Allow-Origin: *

Header set Access-Control-Allow-Headers: content-type

Header set Access-Control-Allow-Methods: *
6
Vero O

Wenn Sie dies in Angular.js erhalten, stellen Sie sicher, dass Sie Ihre Portnummer wie folgt maskieren:

var Project = $resource(
    'http://localhost\\:5648/api/...', {'a':'b'}, {
        update: { method: 'PUT' }
    }
);

Siehe hier für weitere Informationen.

5
Marius

Sie können es zum Laufen bringen, ohne den Server zu verändern, indem Sie den Browser so einstellen, dass der Header Access-Control-Allow-Origin: * in den Antworten der HTTP-OPTIONEN enthalten ist.

Verwenden Sie in Chrome diese Erweiterung . Wenn Sie auf Mozilla sind, überprüfen Sie diese Antwort .

5
forzagreen

Dies liegt an Same-Origin-Richtlinie . Weitere Informationen finden Sie unter Mozilla Developer Network oder Wikipedia .

Grundsätzlich müssen Sie in Ihrem Beispiel die Seite http://nqatalog.negroesquisso.pt/login.php nur von nqatalog.negroesquisso.pt laden, nicht von localhost.

5
antyrat

In Ruby on Rails können Sie in einem Controller Folgendes tun:

headers['Access-Control-Allow-Origin'] = '*'
5
fuzzyalej

Wir haben auch das gleiche Problem mit der in Chrom getesteten Phonegap-Anwendung. Ein Windows-Computer, den wir jeden Tag vor dem Öffnen von Chrome unterhalb der Batch-Datei verwenden. Denken Sie daran, bevor Sie dies ausführen, müssen Sie alle Instanzen von chrome aus dem Task-Manager entfernen, oder Sie können chrome auswählen, um nicht im Hintergrund ausgeführt zu werden.

BATCH: (benutze cmd)

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security
4
abksharma

In Ruby Sinatra

response['Access-Control-Allow-Origin'] = '*' 

für alle oder

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 
1

Wenn Sie die Anfrage erhalten, können Sie

var Origin = (req.headers.Origin || "*");

als wenn du antworten musst geh mit so was:

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': Origin,
    }
);
0
Sunrising