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

时间:2014-03-12 06:13:14

标签: asp.net-web-api cors 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似乎没有问题。但哪里错了?

16 个答案:

答案 0 :(得分:49)

我添加了

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

以及

app.UseCors(CorsOptions.AllowAll);

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

答案 1 :(得分:45)

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

答案 2 :(得分:37)

我使用Cors 5.1.0.0,经过一番头痛,我发现这个问题有待重复 Access-Control-Allow-Origin&amp;来自服务器的Access-Control-Allow-Header标头

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

查看this article了解更多详情。

答案 3 :(得分:7)

实际上,您无法设置多个标头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指令中使用环境变量的方式。

答案 4 :(得分:7)

我既有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" />

希望这有助于某人。

答案 5 :(得分:5)

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请求并显示在列表中,单击并提供所有信息。

Access-Control-Allow-Origin: *

答案 6 :(得分:4)

如果在多个位置配置了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;

答案 7 :(得分: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>

答案 8 :(得分:2)

添加到注册WebApiConfig

passport: {
        strategy: 'saml',
        saml: {
            path: process.env.SAML_PATH || '/saml/path',
            entryPoint: process.env.SAML_ENTRY_POINT || 'link-provided-by-client',
            issuer: 'asd:issuer:as:appname.asd.com',
            entityID: 'as.asd.client.com',
            cert: 'MI...1ln'
         }}

或web.config

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

不是全部

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

当然,如果您实际上将Access-Control-Allow-Origin标头设置为具有多个值,也会发生这种情况 - 例如,以逗号分隔的值列表,kind of supported in the RFC但实际上不受支持大多数主流浏览器。请注意,the RFC talks about how to allow more than one domain也不使用'*'。

例如,您可以使用如下标题在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 wont cache on the server if you use Vary:Origin,这是许多人建议解决此问题的方式。

您可能必须使用“缓存ID修改”响应行为来更改缓存键的构建方式。更多details on this issue in this related StackOverflow question

答案 11 :(得分:1)

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

当我收到此错误时,我花了数小时来寻找解决方案,但没有任何效果,最后我找到了解决该问题的方法,这很简单。 当“ Access-Control-Allow-Origin”标头多次添加到您的响应时,发生此错误,请检查您的apache.conf或httpd.conf(Apache服务器),服务器端脚本,并从这些文件中删除不需要的条目标头

答案 12 :(得分:0)

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

在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”,否则我不会添加它。

这是我有关实现的博客:https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular-6/

答案 13 :(得分:0)

对于那些将IIS与php一起使用的人, 在IIS的服务器端,将web.config文件更新为根目录(wwwroot)并添加

laravel

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

答案 14 :(得分:0)

这是另一个与上面的示例类似的实例,您可能只有一个配置文件定义了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

答案 15 :(得分:0)

如此愚蠢和简单:

我的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"