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?
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') ?>
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.
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
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>
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" );
}
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
dann unter "ExternalHosts"
Fügen Sie einen Eintrag mit dem Wert " http://nqatalog.negroesquisso.pt " hinzu. Ich verwende * nur für Debugging-Zwecke.
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 )
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');
}
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:
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.
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/"
]
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: *
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.
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 .
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
.
In Ruby on Rails können Sie in einem Controller Folgendes tun:
headers['Access-Control-Allow-Origin'] = '*'
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
In Ruby Sinatra
response['Access-Control-Allow-Origin'] = '*'
für alle oder
response['Access-Control-Allow-Origin'] = 'http://yourdomain.name'
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,
}
);