Der ‘Access-Control-Allow-Origin’-Header enthält mehrere Werte

Ich verwende AngularJS $ http auf der Clientseite, um auf einen Endpunkt einer ASP.NET-Web-API-Anwendung auf der Serverseite zuzugreifen. Da der Client in einer anderen Domäne als Server gehostet wird, brauche ich CORS. Es funktioniert für $ http.post (URL, Daten). Aber sobald ich den Benutzer authentifiziere und eine Anfrage über $ http.get (URL) mache, bekomme ich die Nachricht

 Der 'Access-Control-Allow-Origin'-Header enthält mehrere Werte' http://127.0.0.1:9000, http://127.0.0.1:9000 ', aber nur einer ist erlaubt.  Origin 'http://127.0.0.1:9000' ist daher nicht erlaubt.

Fiddler zeigt mir, dass nach einer erfolgreichen Optionsanfrage tatsächlich zwei Headereinträge in der Get-Anfrage vorhanden sind. Was und wo mache ich etwas falsch?

Aktualisieren

Wenn ich jQuery $ .get anstelle von $ http.get verwende, wird dieselbe Fehlermeldung angezeigt. Das scheint bei AngularJS kein Problem zu sein. Aber wo ist es falsch?

   

Ich fügte hinzu

config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, " ", " "))

ebenso gut wie

app.UseCors(CorsOptions.AllowAll);

auf dem Server. Dies führt zu zwei Header-Einträgen. Benutze einfach den Letzten und es funktioniert.

Wir sind auf dieses Problem gestoßen, weil wir CORS nach Best Practice eingerichtet haben (zB http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ) UND ALSO hatte einen benutzerdefinierten Header in web.config.

Entfernen Sie den Eintrag web.config, und alles ist gut.

Entgegen der Antwort von @mww haben wir immer noch EnableCors() in der WebApiConfig.cs UND ein EnableCorsAttribute auf dem Controller. Als wir das eine oder andere herausholten, stießen wir auf andere Probleme.

Ich benutze Cors 5.1.0.0, nachdem ich viel Kopfzerbrechen hatte, entdeckte ich das Problem, dass die Header Access-Control-Allow-Origin und Access-Control-Allow-Header vom Server dupliziert wurden

Die Datei config.EnableCors() aus der Datei WebApiConfig.cs entfernt und das [EnableCors("*","*","*")] in der class Controller festgelegt

Überprüfen Sie diesen Artikel für weitere Details.

Ich hatte auch sowohl OWIN als auch meine WebAPI, die anscheinend beide CORS separat aktiviert haben, die wiederum den 'Access-Control-Allow-Origin' header contains multiple values Fehler.

system.webServer ich ALLEN Code, der CORS aktiviert hatte, und fügte dann dem Knoten system.webServer meiner Web.Config folgendes hinzu:

        

Dies erfüllte die CORS-Anforderungen für OWIN (Anmeldung OPTIONS ) und für WebAPI (API-Aufrufe ermöglichen), aber es verursachte ein neues Problem: Eine OPTIONS Methode konnte während des Preflight für meine API-Aufrufe nicht gefunden werden. Der Fix dafür war einfach – ich musste nur Folgendes aus dem handlers Knoten meiner Web.Config entfernen:

  

Hoffe, das hilft jemandem.

Eigentlich kann man nicht mehrere Header setzen, Access-Control-Allow-Origin (oder zumindest funktioniert es nicht in allen Browsern). Stattdessen können Sie eine Umgebungsvariable bedingt setzen und sie dann in der Header Direktive verwenden:

 SetEnvIf Origin "^(https?://localhost|https://[az]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1 Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN 

In diesem Beispiel wird der Antwort-Header nur hinzugefügt, wenn ein Anfrage-Header Origin mit RegExp übereinstimmt: ^(https?://localhost|https://[az]+\.my\.base\.domain)$ (im Grunde genommen bedeutet localhost über HTTP oder HTTPS und * .my.base.domain über HTTPS).

Denken Sie daran, das setenvif Modul zu aktivieren.

Dokumente:

Übrigens. Das }e in %{ORIGIN_SUB_DOMAIN}e ist kein Tipperrors. So verwenden Sie die Umgebungsvariable in der Header Direktive.

Apache Server:

Ich gebe das gleiche aus, aber es war, weil ich keine Anführungszeichen hatte (“) das Sternchen in meiner Datei, die Zugriff auf den Server, z. B.” .htaccess. ”

 Header add Access-Control-Allow-Origin: * Header add Access-Control-Allow-Origin "*" 

Sie können auch eine Datei ‘.htaccess’ in einem Ordner mit einem anderen ‘.htaccess’ haben, z

 / - .htaccess - public_html / .htaccess (problem here) 

In Ihrem Fall wäre anstelle von ‘*’ ein Asterisk der IP-Server ( http://127.0.0.1:9000 ), dem Sie erlauben, Daten zu liefern.

ASP.NET:

Stellen Sie sicher, dass in Ihrem Code kein “Access-Control-Allow-Origin” -Duplikat vorhanden ist.

Entwicklerwerkzeuge:

Mit Chrome können Sie Ihre Anforderungsheader überprüfen. Drücken Sie die Taste F12 und gehen Sie zur Registerkarte “Netzwerk”, führen Sie jetzt die AJAX-Anfrage und erscheint in der Liste, klicken Sie und geben Sie alle Informationen dort ist.

Zugriffssteuerung-Erlauben-Ursprung: *

Dies passiert, wenn Sie die Cors-Option an mehreren Standorten konfiguriert haben. In meinem Fall hatte ich es auf der Controller-Ebene sowie in der Startup.Auth.cs / ConfigureAuth.

Mein Verständnis ist, wenn Sie es Anwendung weit wollen, dann konfigurieren Sie es unter Startup.Auth.cs / ConfigureAuth wie folgt … Sie benötigen einen Verweis auf Microsoft.Owin.Cors

 public void ConfigureAuth(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll); 

Wenn Sie es lieber auf der Controller-Ebene behalten, können Sie es einfach auf der Controller-Ebene einfügen.

 [EnableCors("http://localhost:24589", "*", "*")] public class ProductsController : ApiController { ProductRepository _prodRepo; 

Wenn Sie in IIS sind, müssen Sie CORS in der Datei web.config aktivieren, dann müssen Sie die Methode App_Start / WebApiConfig.cs Register nicht aktivieren

Meine Lösung war, kommentiert die Zeilen hier:

 // Enable CORS //EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*"); //config.EnableCors(cors); 

und schreibe in die web.config:

       

hatte gerade dieses Problem mit einem Nodejs-Server.

Hier ist, wie ich es behoben habe.
Ich führe meinen Node-Server über einen nginx proxy und ich setze Nginx und node um beide allow cross domain requests zu allow cross domain requests und es nicht so, also habe ich es aus Nginx entfernt und ließ es in Knoten und alles war gut.

Dies kann natürlich auch passieren, wenn Sie Ihren Access-Control-Allow-Origin Header auf mehrere Werte gesetzt haben – zum Beispiel eine durch Kommas getrennte Liste von Werten, die im RFC zwar unterstützt, aber nicht unterstützt wird von den meisten gängigen Browsern. Beachten Sie, dass der RFC darüber spricht, wie mehr als eine Domäne auch ohne Verwendung von ‘*’ zulässig ist.

Beispielsweise können Sie diesen Fehler in Chrome mit einem Header wie folgt erhalten:

Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com

Dies war in Chrome Version 64.0.3282.186 (Official Build) (64-bit)

Wenn Sie dies aufgrund eines CDN in Betracht ziehen und Akamai verwenden, sollten Sie beachten, dass Akamai nicht auf dem Server zwischenspeichert, wenn Sie Vary:Origin , wie viele vorschlagen, dieses Problem zu lösen.

Sie müssen wahrscheinlich ändern, wie Ihr Cache-Schlüssel erstellt wird, indem Sie das Antwortverhalten “Cache-ID-Änderung” verwenden. Weitere Informationen zu diesem Problem finden Sie in dieser verwandten StackOverflow-Frage