Ich benutze .htaccess, um URLs neu zu schreiben, und ich habe das HTML-Basis-Tag verwendet, damit es funktioniert.
Wenn ich jetzt versuche, eine Ajax-Anfrage zu stellen, wird der folgende Fehler angezeigt:
XMLHttpRequest kann
http://www.example.com/login.php
nicht laden. In der angeforderten Ressource ist kein 'Access-Control-Allow-Origin'-Header vorhanden. Origin 'http://example.com
' ist daher kein Zugriff gestattet.
Verwenden Sie addHeader
, anstatt setHeader
zu verwenden.
_response.addHeader("Access-Control-Allow-Origin", "*");
_
*
in der obigen Zeile ermöglicht access to all domains
.
Zum Zulassen von access to specific domain only
:
_response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");
_
Überprüfen Sie diese blog post
.
Der JavaScript-Code ist durch die Same-Origin-Richtlinie begrenzt. Dies bedeutet, dass Sie von einer Seite unter www.example.com
nur (AJAX) -Anfragen an Dienste stellen können, die sich genau unter befinden die gleiche Domain, in diesem Fall genau www.example.com
( nicht example.com
- ohne www
- oder whatever.example.com
).
In Ihrem Fall versucht Ihr Ajax-Code, einen Dienst in http://wordicious.com
von einer Seite aus zu erreichen, die sich unter http://www.wordicious.com
befindet.
Obwohl sehr ähnlich, sind sie nicht dieselbe Domäne. Und wenn sie sich nicht in derselben Domäne befinden, ist die Anforderung nur erfolgreich, wenn die Antwort des Ziels einen Access-Control-Allow-Origin
-Header enthält.
Da Ihre Seite/Ihr Dienst unter http://wordicious.com
niemals für die Anzeige eines solchen Headers konfiguriert wurde, wird diese Fehlermeldung angezeigt.
Wie bereits erwähnt, müssen der Ursprung (auf dem sich die Seite mit JavaScript befindet) und das Ziel (auf dem JavaScript versucht zu erreichen) der exakte sein.
Ihr Fall scheint ein Tippfehler zu sein. Es sieht so aus, als ob http://wordicious.com
und http://www.wordicious.com
tatsächlich derselbe Server/dieselbe Domäne sind. Um das Problem zu beheben, geben Sie das Ziel und den Ursprung gleichermaßen ein: Damit stellen Sie Ajax-Codeanforderungsseiten/-dienste auf http://www.wordicious.com
und nicht http://wordicious.com
. (Platzieren Sie die Ziel-URL möglicherweise relativ, z. B. '/login.php'
, ohne die Domain).
Wenn es sich bei dem Problem nicht um einen Tippfehler handelt, wie er in dieser Frage zu sein scheint, besteht die Lösung darin, den Access-Control-Allow-Origin
zur Zieldomäne hinzuzufügen. Das hängt natürlich vom Server/der Sprache hinter dieser Adresse ab. Manchmal reicht eine Konfigurationsvariable im Tool aus. In anderen Fällen müssen Sie die Überschriften selbst durch Code hinzufügen.
Für .NET Server kann dies in web.config wie unten gezeigt konfiguriert werden
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
</customHeaders>
</httpProtocol>
</system.webServer>
Sagen wir zum Beispiel, wenn die Serverdomäne http://live.makemypublication.com und der Client http://www.makemypublication.com lautet, konfigurieren Sie im Web des Servers .config wie folgt
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
</customHeaders>
</httpProtocol>
</system.webServer>
Wenn Sie diese Fehlermeldung vom Browser erhalten:
In der angeforderten Ressource ist kein 'Access-Control-Allow-Origin'-Header vorhanden. Origin '…' ist daher nicht zugänglich
wenn Sie versuchen, eine Ajax-POST/GET-Anforderung an einen Remote-Server zu senden, auf den Sie keinen Einfluss haben, vergessen Sie bitte diese einfache Korrektur:
<?php header('Access-Control-Allow-Origin: *'); ?>
Was Sie wirklich tun müssen, insbesondere wenn Sie nur JavaScript für die Ajax-Anforderung verwenden, ist ein interner Proxy, der Ihre Anfrage entgegennimmt und an den Remote-Server weiterleitet.
Führen Sie zunächst in Ihrem JavaScript einen Ajax-Aufruf an Ihren eigenen Server durch, etwa:
$.ajax({
url: yourserver.com/controller/proxy.php,
async:false,
type: "POST",
dataType: "json",
data: data,
success: function (result) {
JSON.parse(result);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr);
}
});
Erstellen Sie dann eine einfache PHP Datei mit dem Namen proxy.php, um Ihre POST Daten zu verpacken und als Parameter an den Remote-URL-Server anzuhängen. Ich gebe Ihnen ein Beispiel, wie ich dieses Problem mit der Expedia-API für die Hotelsuche umgehen kann:
if (isset($_POST)) {
$apiKey = $_POST['apiKey'];
$cid = $_POST['cid'];
$minorRev = 99;
$url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?' . 'cid='. $cid . '&' . 'minorRev=' . $minorRev . '&' . 'apiKey=' . $apiKey;
echo json_encode(file_get_contents($url));
}
Durch das Tun von:
echo json_encode(file_get_contents($url));
Sie führen nur die gleiche Abfrage durch, aber auf der Serverseite. Danach sollte die Abfrage einwandfrei funktionieren.
Sie müssen dies zu Beginn Ihrer PHP-Seite "login.php" hinzufügen
<?php header('Access-Control-Allow-Origin: *'); ?>
sie müssen die Kopfzeilenschlüssel/-werte in die Antwort der Optionsmethode einfügen. Wenn Sie beispielsweise eine Ressource unter http://mydomain.com/myresource haben, schreiben Sie in Ihren Servercode
//response handler
void handleRequest(Request request, Response response) {
if(request.method == "OPTIONS") {
response.setHeader("Access-Control-Allow-Origin","http://clientDomain.com")
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
}
}
Die Problemumgehung besteht darin, einen Reverse-Proxy zu verwenden, der auf Ihrem 'Quell'-Host ausgeführt und an Ihren Zielserver weitergeleitet wird, z. B. Fiddler:
Link hier: http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy
Oder ein Apache Reverse Proxy ...
Ändern Sie grundsätzlich die API-Header-Antwort, indem Sie die folgenden zusätzlichen Parameter hinzufügen.
Zugriffssteuerung-Berechtigungsnachweise zulassen: true
Zugriffskontrolle-Erlaube-Herkunft: *
Dies ist jedoch keine gute Lösung, wenn es um die Sicherheit geht
Fügen Sie dies Ihrer PHP Datei oder Ihrem Hauptcontroller hinzu
header("Access-Control-Allow-Origin: http://localhost:9000");
Gelöst mit untenstehendem Eintrag in httpd.conf
#CORS Issue
Header set X-Content-Type-Options "nosniff"
Header always set Access-Control-Max-Age 1728000
Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH"
Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control"
Header always set Access-Control-Allow-Credentials true
#CORS REWRITE
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
#RewriteRule ^(.*)$ $1 [R=200,L]
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_Origin:%{HTTP:Origin}]]
Dieses Problem tritt auf, wenn ich Angular
verwende, um einen Datensatz im Django REST
Backend zu veröffentlichen. Manchmal gibt es keinen bestimmten Grund für dieses Problem. Überprüfen Sie die Fehlermeldung Ihres Djangos sorgfältig, Sie werden eine Lösung finden.