'Access-Control-Allow-Origin'标头包含多个值

Pap*_*lon 93 cors asp.net-web-api angularjs-http

我在客户端使用AngularJS $ http访问服务器端ASP.NET Web API应用程序的端点.由于客户端作为服务器托管在不同的域上,因此我需要CORS.它适用于$ http.post(url,data).但是只要我通过$ http.get(url)对用户进行身份验证并发出请求,我就会收到消息

The 'Access-Control-Allow-Origin' header contains multiple values 'http://127.0.0.1:9000, http://127.0.0.1:9000', but only one is allowed. Origin 'http://127.0.0.1:9000' is therefore not allowed access.

Fiddler告诉我,在成功的选项请求之后,get请求中确实有两个头条目.我做错什么地方在哪里?

更新

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

Pap*_*lon 51

我补充道

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

以及

app.UseCors(CorsOptions.AllowAll);

在服务器上.这导致两个标题条目.只需使用后者即可.

  • **config.EnableCors(enableCorsAttribute)**通常在WebApiConfig.cs中调用 - 它是Microsoft.AspNet.WebApi.Cors Nuget包的一部分,其用法如下所述:http://www.asp.net/ web-api/overview/security/enable-cross-origin-requests-in-web-api**app.UseCors(CorsOptions.AllowAll)**通常在Startup.Auth.cs中调用,作为配置身份提供者的一部分(例如OAuth),并且是Microsoft.Owin.Cors Nuget包的一部分. (7认同)
  • 您似乎正在从设置文件中读取Properties.Settings.Default.Cors.你能发一个例子吗?UseCors是什么类? (4认同)

Bra*_*ski 46

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

删除web.config条目,一切都很好.

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

  • 我删除了这行<add name ="Access-Control-Allow-Origin"value ="*"/>我在web.config文件中有以下其他两个条目,我没有删除:<add name ="Access -Control-Allow-Headers"value ="Content-Type"/> <add name ="Access-Control-Allow-Methods"value ="GET,POST,PUT,DELETE,OPTIONS"/> (10认同)
  • 这是关键,您必须仅启用一次CORS,我的问题是我也在我的web.config和app.UseCors()中启用了它。我删除了web.config条目并仅使用了该应用程序。 (Microsoft.Owin.Cors.CorsOptions.AllowAll); 方法代替。 (2认同)
  • 上面那行救了我的命!确保您不要多次启用 CORS,否则会发生这种情况,您会感到非常沮丧。 (2认同)

小智 40

我正在使用Cors 5.1.0.0,经过多次头痛,我发现问题是从服务器复制Access-Control-Allow-Origin和Access-Control-Allow-Header头

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

查看此文章了解更多详细信息.

  • 这对我有用,只需确保您没有在 web.config 中设置另一个类似的 &lt;add name="Access-Control-Allow-Origin" value="*" /&gt; (2认同)

tfa*_*tfa 18

添加到注册 WebApiConfig

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
Run Code Online (Sandbox Code Playgroud)

或 web.config

<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>  
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)

但不是两者

  • 这对我来说是关键的解决方案,不要两者都做。 (2认同)

Nux*_*Nux 8

实际上你不能设置多个标题Access-Control-Allow-Origin(或者至少它不适用于所有浏览器).相反,您可以有条件地设置环境变量,然后在Header指令中使用它:

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

因此,在此示例中,仅当请求标头Origin与RegExp匹配时才会添加响应标头:( ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$它基本上表示通过HTTP或HTTPS的本地主机和基于HTTPS的*.my.base.domain).

记得启用setenvif模块.

文档:

BTW.在}e%{ORIGIN_SUB_DOMAIN}e是不是一个错字.这是你在Header指令中使用环境变量的方式.


Mat*_*att 8

我既有OWIN也有我的WebAPI,两者显然都需要单独启用CORS,这反过来又会产生'Access-Control-Allow-Origin' header contains multiple values错误.

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

<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>
Run Code Online (Sandbox Code Playgroud)

为OWIN(允许登录)和WebAPI(允许API调用)执行此满足的CORS要求,但它创建了一个新问题:OPTIONS在我的API调用的预检期间找不到方法.解决这个问题很简单 - 我只需要从handlers我的Web.Config节点中删除以下内容:

<remove name="OPTIONSVerbHandler" />
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.


Cho*_*ddy 6

Apache服务器:

我花了同样的钱,但那是因为我的文件中没有引号(")星号提供了对服务器的访问,例如'.htaccess.':

Header add Access-Control-Allow-Origin: * 
Header add Access-Control-Allow-Origin "*" 
Run Code Online (Sandbox Code Playgroud)

你也可能在另一个'.htaccess'文件夹中有一个'.htaccess'文件,例如

/ 
- .htaccess 
- public_html / .htaccess (problem here)
Run Code Online (Sandbox Code Playgroud)

在您的情况下,而不是'*'星号将是http://127.0.0.1:9000您提供服务数据的权限的ip()服务器.

ASP.NET:

检查代码中是否存在"Access-Control-Allow-Origin"副本.

开发者工具:

使用Chrome,您可以验证您的请求标头.按F12键并转到"网络"选项卡,现在运行AJAX请求并显示在列表中,单击并提供所有信息.

Access-Control-Allow-Origin:*

  • 要获取CORS响应标头,您还必须模拟实际的跨域请求,因此,如果您仅查看运行站点上的“网络”标签,该请求可能不会出现。但是,使用DHC(https://chrome.google.com/webstore/detail/dhc-resthttp-api-client/aejoelaoggembcahagimdiliamlcdmfm?hl=zh-CN)之类的东西来运行AJAX请求,从技术上讲是从其他域进行调用,从而触发CORS,并允许您查看访问控制标头。 (2认同)