2014-12-08 2 views
4

우리는 우리의 사이트에 잘 알려진 CORS의 오류가 표시됩니다프리 플라이트 요청을 할 때 Access-Control-Allow-Origin CORS 헤더가 필요합니까?

은 XMLHttpRequest https://my-site.com/api를로드 할 수 없습니다. 'Access-Control-Allow-Origin'헤더가 요청 된 리소스에 없습니다. 따라서 원점 'https://my-other-site.com'은 액세스 할 수 없습니다.

것은이의 Access-Control-Allow-Origin

OPTIONS https://my-site.com/api HTTP/1.1 Host: my-site.com Access-Control-Request-Method: POST Origin: https://my-other-site.com Access-Control-Request-Headers: my-custom-header, accept, content-type Accept: */* Referer: https://my-other-site.com/ ...other stuff... HTTP/1.1 200 OK Access-Control-Allow-Origin: https://my-other-site.com Access-Control-Allow-Methods: POST Access-Control-Allow-Headers: my-custom-header, accept, content-type Access-Control-Expose-Headers: my-custom-header ...other stuff... 

... 그러나, 이후의 요청에 하지 세트입니다 ... 프리 플라이트 요청에 올바르게 설정
입니다.

POST https://my-site.com/api HTTP/1.1 
Host: my-site.com 
Accept: */* 
My-Custom-Header: abcd123 
Origin: https://my-other-site.com 
Referer: https://my-other-site.com/ 
...other stuff... 


HTTP/1.1 200 OK 
My-Custom-Header: abcd123 
...other stuff... 

나는이 문제를 이해하지 못한다. 에 따르면 모든 것 온라인으로 읽었습니다. 프리 플라이트 요청을 사용하는 경우 실제 요청에 CORS 헤더를 추가 할 필요가 없습니다. 그러나 분명히 그렇지 않습니다.

모든 예제 herehere는 실제 응답에 Access-Control-Allow-Origin 헤더를 포함하지만 다른 "필요" CORS 헤더 중 하나를 포함하지 않는다. 실제 응답에 하나의 헤더를 추가하면 오류가 사라집니다. 그래서 제 질문은, 실제로 모두 요청에 필요한 Access-Control-Allow-Origin 헤더는


이다? 어디에 명시되어 있습니까? 왜 그게 사실입니까?

답변

4

예, 두 응답에 필요한 CORS 헤더가 포함되어야합니다.

Simple Cross-Origin RequestCross-Origin Request with Preflight 모두 "실제 요청"은 프리 플라이트와 관계없이 CORS 헤더를 확인하는 동일한 동작을 따릅니다 (각각 1 단계 및 3 단계).

  1. [...]를 make a request steps 적용하고 요청을하면서 아래 요청 규칙을 준수.

    • ... :
    • 그렇지 않으면

      resource sharing check를 수행 (냈다 3xx의 코드는, 중단 및 네트워크 오류). [...다음]

주어진 자원의 리소스 공유 체크 알고리즘은 : 응답이 없거나 하나 이상의 Access-Control-Allow-Origin 헤더를 포함

  1. 하면 값을 반환하면 실패하고이 알고리즘을 종료합니다.

  2. [...]

은 플라이트 요청은 처음부터 "실제 요청"을 방지한다.

+0

* ""실제 요청 "은 프리 플라이트에 관계없이 CORS 헤더를 확인하면서 동일한 동작을 따릅니다. * - 예외는 사실이 아닌 것으로 보입니다. 실제 요구는'Access-Control-Allow-Methods' 또는'Access-Control-Allow-Headers' 헤더없이 올바르게 동작합니다. 그러나 * (지금 방금 발견 했음) *,'Access-Control-Expose-Headers' 헤더는 프리 플라이트와 실제 요청 모두에 필요합니다. WTF !? –

관련 문제