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

在...创建的问题 Wed, Mar 12, 2014 12:00 AM

我在客户端使用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似乎没有问题。但哪里错了?

    
89
15答案                              15 跨度>                         

我添加了

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

以及

app.UseCors(CorsOptions.AllowAll);

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

    
50
2014-03-12 07:34:07Z
  1. 好像您正在从设置文件中读取Properties.Settings.Default.Cors。你能发一个例子吗?什么类是UseCors?
    2014-10-21 21:16:41Z
  2. “未捕获的ReferenceError:未定义EnableCorsAttribute”??
    2014-10-22 19:01:41Z
  3. @ Hoppe,请看一下 msdn.microsoft.com/en-us/library/dn314597(v = vs.118).aspx 。它解释说,EnableCorsAttribute的第一个参数是允许的起源。例如“*”允许所有。
    2014-10-23 04:46:52Z
  4. @ Hoppe,UseCors是NuGet包中定义的扩展方法Microsoft.Owin.Cors。顺丰速 katanaproject.codeplex.com/SourceControl/latest#src/...
    2014-10-23 04:50:29Z
  5. config.EnableCors(enableCorsAttribute)通常在WebApiConfig.cs中调用 - 它是Microsoft.AspNet.WebApi.Cors Nuget包的一部分,这里描述了它的用法: asp.net/web-api/overview/security/... app.UseCors(CorsOptions.AllowAll)通常在Startup.Auth.cs中调用,作为配置身份提供者的一部分(例如OAuth),并且是Microsoft.Owin.Cors Nuget包的一部分。
    2015-01-23 10:28:14Z
  6. 醇>

我们遇到了这个问题,因为我们根据最佳实践建立了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。当我们拿出一个或另一个时,我们遇到了其他问题。

    
45
2015-01-12 22:16:32Z
  1. 我删除了这一行&lt; add name =“Access-Control-Allow-Origin“value =”*“/&gt;并且我在web.config文件中有以下其他两个条目,我没有删除:&lt; add name =”Access-Control-Allow-Headers“value =”Content -Type“/&gt;&lt; add name =”Access-Control-Allow-Methods“value =”GET,POST,PUT,DELETE,OPTIONS“/&gt;
    2015-07-08 05:56:36Z
  2. 这是我的问题..谢谢
    2016-04-14 23:10:17Z
  3. 这是关键,你必须只启用CORS一次,我的问题是我也在我的web.config和app.UseCors()中启用了它。 。我删除了web.config条目,只使用了app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);方法改为。
    2016-08-16 22:42:26Z
  4. 上面的一行救了我的命!确保你不会多次启用CORS,否则会发生这种情况,你会非常沮丧。
    2016-09-14 20:26:47Z
  5. “这是关键,你必须只启用CORS一次”&lt; - 这就是@MohammadSepahvand感谢。回到.NET并且已经感到惊讶:D。
    2018-03-06 12:25:35Z
  6. 醇>

我正在使用Cors 5.1.0.0,经过一番头痛之后,我发现问题是重复的 Access-Control-Allow-Origin&amp;来自服务器的Access-Control-Allow-Header标头

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

查看本文了解更多详情。

    
38
2015-11-30 04:51:30Z

实际上你不能设置多个标题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

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

请记住启用setenvif模块。

文档:

顺便说一句。 }e中的%{ORIGIN_SUB_DOMAIN}e不是拼写错误。这就是你在Header指令中使用环境变量的方法。

    
7
2014-09-08 19:08:03Z
  1. 您是否有不设置多个访问控制标头的来源?我找不到任何证实这一点的东西。
    2014-10-28 16:38:06Z
  2. 非常智能和干净的解决方案。为我工作。
    2015-11-04 09:39:59Z
  3. @ Spencer“注意:在实践中,origin-list-or-null生产受到更多约束。而不是允许以空格分隔的原始列表,它是单个来源或字符串“null”。“ w3.org/TR/cors/#access-控制允许来源-响应头
    2015-11-05 16:22:10Z
  4. 醇>

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

我最终删除了启用CORS的所有代码,然后将以下内容添加到我的Web的system.webServer节点中.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>

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

 
<remove name="OPTIONSVerbHandler" />

希望这有助于某人。

    
7
2015-08-05 22:51:01Z

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,您可以验证您的请求标头。按F12键并转到“网络”选项卡,现在运行AJAX请求并显示在列表中,单击并提供所有信息。

    
5
2014-03-22 00:41:32Z
  1. 有时它很容易......当试图让那些混乱的Web服务在IIS /Chrome上运行时,我使用了Application_BeginRequest方法,并忘记了它。我自己的代码重复!谢谢你指着我显而易见的! :)
    2014-10-31 08:36:32Z
  2. 要获取CORS响应头,您还必须模拟实际的跨源请求,因此如果您只是查看网络选项卡,它可能不会出现在运行的网站上。但是,请使用DHC之类的内容( chrome.google运行AJAX请求的.com /webstore /detail /dhc-resthttp-api-client /... 将从技术上调用来自不同的域,从而触发CORS并允许您查看访问控制头。 /DIV>
    2015-01-23 10:31:29Z
    醇>

    如果在多个位置配置了Cors选项,则会发生这种情况。在我的情况下,我在控制器级别以及Startup.Auth.cs /ConfigureAuth中都有它。

    我的理解是,如果你想要它的应用程序范围,那么只需在Startup.Auth.cs /ConfigureAuth下配置它就像这样......你需要引用Microsoft.Owin.Cors

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

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

     
    [EnableCors("http://localhost:24589", "*", "*")]
        public class ProductsController : ApiController
        {
            ProductRepository _prodRepo;
    
        
    4
    2015-08-09 15:17:19Z
    1. 在我的情况下,我在Web.Config和MyAppApiConfig.cs中设置了它。从后者中删除它解决了我的问题。
      2016-06-21 21:29:43Z
    2. 醇>

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

    我的解决方案在这里评论了这些内容:

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

    并写入web.config:

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

        
    2
    2017-10-26 02:00:05Z

    添加到注册WebApiConfig

     
    var cors = new EnableCorsAttribute("*", "*", "*");
    config.EnableCors(cors);
    

    或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>
    

    但不是两个

        
    2
    2019-03-08 15:28:20Z
    1. 这是我的关键解决方案,不要两者都做。
      2019-04-17 03:07:29Z
    2. 醇>

    刚刚遇到nodejs服务器的这个问题。

    这是我如何解决它。
    我通过nginx proxy运行我的节点服务器,我将nginx和node设置为allow cross domain requests并且它不是那样的,所以我将它从nginx中删除并将其保留在节点中并且一切都很好。

        
    1
    2014-08-08 02:47:10Z
    1. 谢谢你的回答!它解决了我用nginx + Rack(Ruby)设置长时间无法解决的问题。同样的问题,相同的解决方案:关闭nginx中的标题添加,让rack-cors gem处理CORS的东西。 Bam,已修复。
      2017-03-25 20:24:13Z
    2. 醇>

    当然,如果您实际上已将Access-Control-Allow-Origin标头设置为具有多个值,也会发生这种情况 - 例如,以逗号分隔的值列表,即 RFC支持的类型,但大多数主流浏览器实际上并不支持。请注意, RFC谈论如何允许多个域而不使用'*'也是。

    例如,您可以使用如下标题在Chrome中获取该错误:

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

    这是在Chrome Version 64.0.3282.186 (Official Build) (64-bit)

    请注意,如果您因CDN而考虑此问题,并且使用Akamai,则可能需要注意如果您使用的话,Akamai不会在服务器上缓存 Vary:Origin,许多建议解决此问题的方式。

    您可能必须使用“缓存ID修改”响应行为来更改缓存键的构建方式。更多此相关StackOverflow问题中有关此问题的详细信息

        
    1
    2018-04-23 19:07:12Z
    1. 所以基本上,你现在不能,因为你想要互联网上的每个域都打到网址是值得怀疑的。
      2018-09-23 02:30:08Z
    2. Akamai链接需要登录。
      2019-03-20 19:16:03Z
    3. 是的,似乎是这些文档的akamai要求; - (
      2019-03-21 00:27:44Z
    4. 醇>

    我遇到了同样的问题,这就是我解决它的问题:

    在WebApi服务中,在Global.asax中我编写了以下代码:

     
    Sub Application_BeginRequest()
            Dim currentRequest = HttpContext.Current.Request
            Dim currentResponse = HttpContext.Current.Response
    
            Dim currentOriginValue As String = String.Empty
            Dim currentHostValue As String = String.Empty
    
            Dim currentRequestOrigin = currentRequest.Headers("Origin")
            Dim currentRequestHost = currentRequest.Headers("Host")
    
            Dim currentRequestHeaders = currentRequest.Headers("Access-Control-Request-Headers")
            Dim currentRequestMethod = currentRequest.Headers("Access-Control-Request-Method")
    
            If currentRequestOrigin IsNot Nothing Then
                currentOriginValue = currentRequestOrigin
            End If
    
            If currentRequest.Path.ToLower().IndexOf("token") > -1 Or Request.HttpMethod = "OPTIONS" Then
                currentResponse.Headers.Remove("Access-Control-Allow-Origin")
                currentResponse.AppendHeader("Access-Control-Allow-Origin", "*")
            End If
    
            For Each key In Request.Headers.AllKeys
                If key = "Origin" AndAlso Request.HttpMethod = "OPTIONS" Then
                    currentResponse.AppendHeader("Access-Control-Allow-Credentials", "true")
                    currentResponse.AppendHeader("Access-Control-Allow-Methods", currentRequestMethod)
                    currentResponse.AppendHeader("Access-Control-Allow-Headers", If(currentRequestHeaders, "GET,POST,PUT,DELETE,OPTIONS"))
                    currentResponse.StatusCode = 200
                    currentResponse.End()
                End If
            Next
    
        End Sub
    

    此处此代码仅允许飞行前和令牌请求在响应中添加“Access-Control-Allow-Origin”,否则我不会添加它。

    这是关于im的博客补充: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular -6 /

        
    0
    2018-10-04 16:07:24Z

    对于那些使用IIS的人, 在IIS它服务器端更新web.config文件它根目录(wwwroot)并添加此

     
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.webServer>
            <directoryBrowse enabled="true" />
            <httpProtocol>
                <customHeaders>
                    <add name="Control-Allow-Origin" value="*"/>
                </customHeaders>
            </httpProtocol>
        </system.webServer>
    </configuration>
    

    之后重启IIS服务器,  在RUN中键入IISReset并输入

        
    0
    2018-10-15 06:56:28Z

    这是另一个类似于上面示例的实例,您可能只有一个配置文件定义CORS所在的位置:IIS服务器上的两个web.config文件位于不同目录中的路径上,其中一个隐藏在虚拟目录。 为了解决这个问题,我删除了根级配置文件,因为路径使用的是虚拟目录中的配置文件。 必须选择其中一个。

     
    URL called:  'https://example.com/foo/bar'
                         ^              ^
          CORS config file in root      virtual directory with another CORS config file
              deleted this config             other sites using this
    
    
        
    0
    2019-02-07 21:41:38Z

    如此愚蠢和简单:

    当我的Apache配置文件中有两次Header always set Access-Control-Allow-Origin *时,我遇到了这个问题。一旦使用VirtualHost标签,一旦进入Limit标签:

     
    <VirtualHost localhost:80>
      ...
      Header set Access-Control-Allow-Origin: *
      ...
      <Limit OPTIONS>
        ...
        Header set Access-Control-Allow-Origin: *
        ...
      </Limit>
    </VirtualHost>
    

    删除一个条目解决了这个问题。

    我想在原帖中它会有两次:

     
    Header set Access-Control-Allow-Origin: "http://127.0.0.1:9000"
    
        
    0
    2019-03-06 16:12:04Z
来源放置 这里