'Access-Control-Allow-Origin'헤더에 여러 값이 포함되어 있습니다.


104

클라이언트 측에서 AngularJS $ http를 사용하여 서버 측에서 ASP.NET 웹 API 애플리케이션의 끝점에 액세스하고 있습니다. 클라이언트가 서버와 다른 도메인에서 호스팅되므로 CORS가 필요합니다. $ http.post (url, data)에서 작동합니다. 하지만 사용자를 인증하고 $ 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'은 액세스가 허용되지 않습니다.

Fiddler는 성공적인 옵션 요청 후 get 요청에 실제로 두 개의 헤더 항목이 있음을 보여줍니다. 내가 무엇을 어디에서 잘못하고 있습니까?

최신 정보

$ http.get 대신 jQuery $ .get을 사용하면 동일한 오류 메시지가 나타납니다. 따라서 이것은 AngularJS에 문제가없는 것 같습니다. 그러나 그것이 잘못된 곳은 어디입니까?


글쎄, 헤더에는 무엇이 포함되어 있습니까?
eckes

답변:


53

나는 추가했다

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

만큼 잘

app.UseCors(CorsOptions.AllowAll);

서버에서. 결과적으로 두 개의 헤더 항목이 생성됩니다. 후자를 사용하면 작동합니다.


4
설정 파일에서 Properties.Settings.Default.Cors를 읽는 것 같습니다. 예제를 게시 할 수 있습니까? 그리고 UseCors는 어떤 클래스에 있습니까?
Hoppe 2014 년

"Uncaught ReferenceError : EnableCorsAttribute is not defined"??
회로망

@Hoppe, msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx를 살펴보십시오 . EnableCorsAttribute의 첫 번째 매개 변수가 허용 된 원본임을 설명합니다. 예를 들어 "*"는 모두 허용합니다.
Papa Mufflon 2014 년

1
@Hoppe, UseCors는 NuGet 패키지 Microsoft.Owin.Cors에 정의 된 확장 메서드입니다. SF katanaproject.codeplex.com/SourceControl/latest#src/... .
Papa Mufflon 2014 년

7
config.EnableCors (enableCorsAttribute) 는 일반적으로 WebApiConfig.cs에서 호출됩니다.이 패키지는 Microsoft.AspNet.WebApi.Cors Nuget 패키지의 일부이며 여기에 사용 설명이 설명되어 있습니다. asp.net/web-api/overview/security/… 앱 .UseCors (CorsOptions.AllowAll) 는 일반적으로 ID 공급자 (예 : OAuth) 구성의 일부로 Startup.Auth.cs에서 호출되며 Microsoft.Owin.Cors Nuget 패키지의 일부입니다.
Henry C

51

모범 사례 (예 : http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ) 에 따라 CORS를 설정했기 때문에이 문제가 발생했습니다. 또한 <add name="Access-Control-Allow-Origin" value="*"/>web.config에 사용자 지정 헤더 가 있습니다.

web.config 항목을 제거하면 모두 정상입니다.

@mww의 답변과는 달리 EnableCors()WebApiConfig.cs 및 EnableCorsAttribute컨트롤러에 여전히 있습니다 . 둘 중 하나를 꺼냈을 때 다른 문제가 발생했습니다.


11
이 줄 <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 "/>
Siva Karthikeyan

2
이것이 핵심입니다. CORS를 한 번만 활성화해야합니다. 제 문제는 web.config뿐만 아니라 app.UseCors ()에서도 활성화했다는 것입니다. web.config 항목을 제거하고 방금 앱을 사용했습니다. (Microsoft.Owin.Cors.CorsOptions.AllowAll); 대신 방법.
Mohammad Sepahvand

1
위의 선이 내 생명을 구했습니다! CORS를 두 번 이상 활성화하지 마십시오. 그렇지 않으면 이런 일이 발생하고 매우 실망하게됩니다.
TGarrett

web.config에서 <add name = "Access-Control-Allow-Headers"value = "Content-Type"/>을 제거하고 저를 위해 수정했습니다
jbooker

1
"이것이 핵심입니다. CORS를 한 번만 활성화해야합니다."<-이것은 @MohammadSepahvand 감사합니다. .NET으로 돌아가서 이미 놀랐습니다. : D.
Tuan Jinn

42

나는 Cors 5.1.0.0을 사용하고 있는데, 많은 두통 끝에 서버의 Access-Control-Allow-Origin & Access-Control-Allow-Header 헤더가 중복되는 문제를 발견했습니다.

config.EnableCors()WebApiConfig.cs 파일에서 제거 되었으며 [EnableCors("*","*","*")]Controller 클래스에 속성 만 설정했습니다.

자세한 내용이 기사 를 확인하십시오 .


이것은 나를 위해 작동합니다. web.config
Crismogram

12

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
이것이 저에게있어 핵심적인 해결책이었습니다. 둘 다하지 마십시오.
robnick

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

따라서이 예제에서 응답 헤더는 요청 헤더 Origin가 RegExp :와 일치 하는 경우에만 추가됩니다 ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$(기본적으로 HTTP 또는 HTTPS를 통한 localhost 및 HTTPS를 통한 * .my.base.domain을 의미 함).

setenvif모듈 을 활성화하는 것을 잊지 마십시오 .

문서 :

BTW. }e에서는 %{ORIGIN_SUB_DOMAIN}e오타가 아닙니다. Header디렉티브 에서 환경 변수를 사용하는 방법 입니다.


1
다중 액세스 제어 헤더를 설정하지 않는 소스가 있습니까? 이것을 확인하는 것을 찾을 수 없습니다.
Spencer

매우 똑똑하고 깨끗한 솔루션. 나를 위해 일했습니다.
Alex Kalmikov 2011

@Spencer "참고 : 실제로 origin-list-or-null 생산은 더 제한적입니다. 공백으로 구분 된 출처 목록을 허용하는 대신 단일 출처 또는 문자열"null " 입니다." w3.org/TR/cors/#access-control-allow-origin-response-header
Nux

8

나도 OWIN과 WebAPI를 모두 가지고 있었는데 둘 다 CORS를 별도로 활성화해야했기 때문에 'Access-Control-Allow-Origin' header contains multiple values오류가 발생했습니다.

CORS를 활성화 한 모든 코드를 제거한 다음 system.webServerWeb.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 요구 사항이 충족되었지만 새로운 문제가 발생했습니다. OPTIONSAPI 호출을위한 프리 플라이트 중에 메서드를 찾을 수 없습니다. 이에 대한 수정은 간단했습니다 handlers. Web.Config 노드 에서 다음을 제거하면됩니다 .

<remove name="OPTIONSVerbHandler" />

이것이 누군가를 돕기를 바랍니다.


7

Apache 서버 :

나는 똑같이 지출하지만, 서버에 대한 액세스를 제공 한 파일에 별표 ( ")가 없었기 때문입니다 (예 : '.htaccess.').

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

다른 '.htaccess'가있는 폴더에 '.htaccess'파일이있을 수도 있습니다.

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

귀하의 경우 '*'대신 별표는 http://127.0.0.1:9000데이터 제공 권한을 부여 하는 ip ( ) 서버입니다.

ASP.NET :

코드에 'Access-Control-Allow-Origin'중복이 없는지 확인하십시오.

개발자 도구:

Chrome을 사용하면 요청 헤더를 확인할 수 있습니다. F12 키를 누르고 '네트워크'탭으로 이동하여 이제 AJAX 요청을 실행하고 목록에 표시되고 클릭하여 모든 정보를 제공합니다.

액세스 제어 허용 출처 : *


때로는 그렇게 쉽습니다. 혼란스러운 웹 서비스를 IIS / Chrome에서 실행하는 동안 저는 Application_BeginRequest 메서드를 가지고 놀았고 잊어 버렸습니다 ... 내 코드에서 중복! 저에게 명백한 것을 알려 주셔서 감사합니다! :)
Juergen Riemer 2014 년

2
CORS 응답 헤더를 얻으려면 실제 교차 출처 요청을 시뮬레이션해야하므로 실행중인 사이트의 네트워크 탭만 보면 나타나지 않을 수 있습니다. 그러나 DHC ( chrome.google.com/webstore/detail/dhc-resthttp-api-client/… ) 와 같은 것을 사용 하여 AJAX 요청을 실행하면 기술적으로 다른 도메인에서 호출되므로 CORS가 트리거되고 액세스 제어 헤더.
Henry C

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;

제 경우에는 Web.Config와 MyAppApiConfig.cs 모두에 설정했습니다. 후자에서 제거하면 문제가 해결되었습니다.
Jim B

4

IIS에있는 경우 web.config에서 CORS를 활성화해야하며 App_Start / WebApiConfig.cs Register 메서드에서 활성화 할 필요가 없습니다.

내 해결책은 다음과 같습니다.

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

물론 실제로 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를 사용하는 경우 Vary:Origin , 많은 사람들이이 문제를 해결하기 위해 제안하는 방식 인를 사용하면 Akamai가 서버에서 캐시하지 않는다는 점에 유의할 수 있습니다 .

"캐시 ID 수정"응답 동작을 사용하여 캐시 키 작성 방법을 변경해야 할 것입니다. 이 관련 StackOverflow 질문에서이 문제에 대한 자세한 내용


따라서 기본적으로 인터넷의 모든 단일 도메인이 URL에 도달하기를 원할 것이 확실하지 않기 때문에 지금 당장은 할 수 없습니다.
scottheckel

Akamai 링크는 로그인이 필요합니다.
Jean-François Savard

그래 그 ;-( 그 문서에 대한 아카 마이의 요구 사항 것으로 보인다
브래드 공원

Chrome에서이 오류를 발생시키는 또 다른 방법은 공백으로 구분 된 값 목록입니다 Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com.. 즉 것이 올바른 방법이 될 수 있지만, 브라우저는 여기에 표준 (따르지 않는 소스 ).
tanius 2011

2

너무 멍청하고 간단합니다.

이 문제는 Header always set Access-Control-Allow-Origin *Apache 구성 파일 내에서 두 시간을 보낼 때 발생했습니다 . withing에 한 번 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"

1

nodejs 서버 에서이 문제가 발생했습니다.

여기에 내가 그것을 고친 방법이 있습니다.
나는 a를 통해 내 노드 서버를 실행하고 nginx proxynginx와 node둘 다로 설정 allow cross domain requests했지만 그게 마음에 들지 않았으므로 nginx에서 제거하고 노드에 남겨 두었고 모두 잘되었습니다.


이 답변에 감사드립니다! nginx + Rack (Ruby) 설정으로 오랫동안 해결하지 못했던 문제를 해결했습니다. 동일한 문제, 동일한 솔루션 : nginx에서 헤더 추가를 끄고 rack-corsgem이 CORS 작업을 처리하도록합니다. Bam, 고정.
Pistos 2017 년

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 /


0

php와 함께 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

다음은 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

'Access-Control-Allow-Origin'헤더에 여러 값이 포함되어 있습니다.

이 오류를 받았을 때 나는 이것에 대한 해결책을 검색하는 데 많은 시간을 보냈지 만 아무것도 작동하지 않았으며 마침내이 문제에 대한 해결책을 찾았습니다. ''Access-Control-Allow-Origin '헤더가 응답에 두 번 이상 추가되면이 오류가 발생하면 apache.conf 또는 httpd.conf (Apache 서버), 서버 측 스크립트를 확인하고이 파일에서 원하지 않는 항목 헤더를 제거하십시오. .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.