“Access-Control-Allow-Origin”标题包含多个值

我在客户端使用AngularJS $ http访问服务器端的ASP.NET Web API应用程序的端点。 由于客户端与服务器位于不同的域,因此我需要CORS。 它适用于$ http.post(url,数据)。 但只要我authentication用户,并通过$ http.get(url)发出请求,我收到消息

 “Access-Control-Allow-Origin”头包含多个值“http://127.0.0.1:9000,http://127.0.0.1:9000”,但只允许有一个值。 原因'http://127.0.0.1:9000'因此不被允许访问。

提琴手向我展示,在获得成功的选项请求后,确实有两个标题条目。 什么和我在哪里做错了什么?

更新

当我使用jQuery $ .get而不是$ http.get时,出现相同的错误信息。 所以这对于AngularJS来说似乎没有问题。 但是哪里错了?

我补充说

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

以及

app.UseCors(CorsOptions.AllowAll);

在服务器上。 这导致两个标题条目。 只要使用后者,它的工作原理。

我们遇到了这个问题,因为我们已经根据最佳实践设置了CORS(例如http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ),在web.config中也有一个自定义的头文件<add name="Access-Control-Allow-Origin" value="*"/>

删除web.config项,一切正常。

与@ mww的答案相反,我们在WebApiConfig.cs中还有EnableCors() ,在控制器上还有EnableCorsAttribute 。 当我们拿出一个或另一个,我们遇到了其他问题。

我在使用Cors 5.1.0.0之后,非常头疼,我发现要复制的问题Access-Control-Allow-Origin&Access-Control-Allow-Header头从服务器

从WebApiConfig.cs文件中删除config.EnableCors() ,并在Controller类上设置[EnableCors("*","*","*")]属性

检查这篇文章的更多细节。

我也有OWIN以及我的WebAPI,这两个显然需要单独启用CORS,这又创build了'Access-Control-Allow-Origin' header contains multiple values错误。

我最终删除了启用CORS的所有代码,然后将以下内容添加到我的Web.Config的system.webServer节点中:

 <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" /> <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" /> </customHeaders> </httpProtocol> 

这样做满足了OWIN(允许login)和WebAPI(允许API调用)的CORS要求,但是它创build了一个新问题:在我的API调用的预检期间找不到OPTIONS方法。 修复这很简单 – 我只需要从handlers节点我的Web.Config删除以下内容:

 <remove name="OPTIONSVerbHandler" /> 

希望这有助于某人。

Apache服务器:

我花了相同的,但这是因为我没有引号(“)我的文件中提供访问服务器,如”.htaccess“的星号:

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

你也可以在另一个“.htaccess”文件夹中有.htaccess文件,例如

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

在你的情况下,而不是'*'星号将是你授权服务数据的IP( http://127.0.0.1:9000 )服务器。

ASP.NET:

检查代码中是否有“Access-Control-Allow-Origin”重复。

开发者工具:

使用Chrome,您可以validation您的请求标题。 按F12键,进入“networking”选项卡,现在运行AJAX请求并出现在列表中,单击并提供所有信息。

Access-Control-Allow-Origin:*

其实你不能设置多个标题Access-Control-Allow-Origin (或者至less它不能在所有浏览器中工作)。 相反,你可以有条件地设置一个环境variables,然后在Header指令中使用它:

 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 

因此,在这个例子中,只有当请求标头Origin匹配RegExp时,才会添加响应标头: ^(https?://localhost|https://[az]+\.my\.base\.domain)$表示通过HTTP或HTTPS的本地主机和通过HTTPS的* .my.base.domain)。

记得启用setenvif模块。

文档:

BTW。 %{ORIGIN_SUB_DOMAIN}e中的%{ORIGIN_SUB_DOMAIN}e不是拼写错误。 这是你如何在Header指令中使用环境variables。

当您在多个地点configurationCors选项时,会发生这种情况。 在我的情况下,我在控制器级别以及在Startup.Auth.cs / ConfigureAuth。

我的理解是,如果你想要它的应用程序广泛,然后只需要像这样在Startup.Auth.cs / ConfigureAuthconfiguration它…您将需要参考Microsoft.Owin.Cors

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

如果您宁愿将其保存在控制器级别,那么您可以在控制器级别插入。

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

刚刚有一个nodejs服务器的这个问题。

这里是我如何修复它。
我运行我的节点服务器通过一个nginx proxy ,我设置nginx和nodeallow cross domain requests ,并没有这样做,所以我从nginx中删除它,并把它留在节点,一切都很好。

如果你在IIS中,你需要在web.config中激活CORS,那么你不需要在App_Start / WebApiConfig.cs中启用Register方法

我的解决scheme是,在这里评论的线:

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

并在web.config中写入:

 <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol>