[angularjs] AngularJS는 출처 간 자원에 대한 OPTIONS HTTP 요청을 수행합니다.

템플릿 파일을 제공하는 자산 호스트가 다른 도메인에 있으므로 각도가 수행하는 XHR 요청이 도메인 간이어야하는 교차 출처 리소스와 통신하도록 AngularJS를 설정하려고합니다. HTTP 요청 이이 작업을 수행 할 수 있도록 적절한 CORS 헤더를 서버에 추가했지만 작동하지 않는 것 같습니다. 문제는 브라우저 (크롬)에서 HTTP 요청을 검사 할 때 자산 파일로 전송 된 요청이 OPTIONS 요청 (GET 요청이어야 함)이라는 것입니다.

이것이 AngularJS의 버그인지 또는 구성해야하는지 확실하지 않습니다. 내가 이해 한 바에 따르면 XHR 래퍼는 OPTIONS HTTP 요청을 할 수 없으므로 브라우저가 GET 요청을 수행하기 전에 먼저 자산을 다운로드 할 수 있는지 여부를 파악하려고하는 것처럼 보입니다. 이 경우 자산 호스트로 CORS 헤더 (Access-Control-Allow-Origin : http://asset.host .. )를 설정해야합니까?



답변

OPTIONS 요청은 결코 AngularJS 버그가 아니며, 이는 Cross-Origin Resource Sharing 표준이 브라우저의 동작을 지시하는 방식입니다. 이 문서를 참조하십시오 : https://developer.mozilla.org/en-US/docs/HTTP_access_control 여기서 “개요”섹션에 다음과 같이 나와 있습니다.

Cross-Origin Resource Sharing 표준은 서버가 웹 브라우저를 사용하여 해당 정보를 읽을 수있는 원본 세트를 설명 할 수있는 새로운 HTTP 헤더를 추가하여 작동합니다. 또한 사용자 데이터에 부작용을 일으킬 수있는 HTTP 요청 방법 (특히 GET 이외의 HTTP 방법 또는 특정 MIME 유형의 POST 사용)에 사용됩니다. 이 사양은 브라우저가 HTTP OPTIONS 요청 헤더를 사용하여 서버에서 지원되는 메소드를 요청한 다음 서버에서 “승인”하면 실제 HTTP 요청 메소드를 사용하여 실제 요청을 전송하도록 브라우저가 요청을 “프리 플라이트”하도록 규정합니다. 서버는 또한 “신임 정보”(쿠키 및 HTTP 인증 데이터 포함)를 요청과 함께 보내야하는지 여부를 클라이언트에 알릴 수 있습니다.

서버 자체와 지원하려는 HTTP 동사에 따라 설정이 달라 지므로 모든 WWW 서버에서 작동하는 일반적인 솔루션을 제공하는 것은 매우 어렵습니다. 서버에서 보내야하는 정확한 헤더에 대한 자세한 내용 이 담긴이 훌륭한 기사 ( http://www.html5rocks.com/en/tutorials/cors/ ) 를 살펴 보시기 바랍니다.


답변

Angular 1.2.0rc1 +의 경우 resourceUrlWhitelist를 추가해야합니다.

1.2 : 릴리스 버전에서는 escapeForRegexp 함수를 추가하여 더 이상 문자열을 이스케이프 할 필요가 없습니다. URL을 직접 추가 할 수 있습니다

'http://sub*.assets.example.com/**' 

하위 폴더에 **를 추가해야합니다. 1.2의 작동하는 jsbin은 다음과 같습니다.
http://jsbin.com/olavok/145/edit


1.2.0rc : 여전히 rc 버전 인 경우 Angular 1.2.0rc1 솔루션은 다음과 같습니다.

.config(['$sceDelegateProvider', function($sceDelegateProvider) {
     $sceDelegateProvider.resourceUrlWhitelist(['self', /^https?:\/\/(cdn\.)?yourdomain.com/]);
 }])

다음은 1.2.0rc1에서 작동하는 jsbin 예제입니다.
http://jsbin.com/olavok/144/edit


1.2 이전 : 이전 버전 ( http://better-inter.net/enabling-cors-in-angular-js/ 참조 )의 경우 구성에 다음 두 줄을 추가해야합니다.

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

1.2 이전 버전에서 작동하는 jsbin 예제는 다음과 같습니다.
http://jsbin.com/olavok/11/edit


답변

참고 : 최신 버전의 Angular에서는 작동하지 않습니다.

실물:

OPTIONS 요청을 무시할 수도 있습니다 (Chrome에서만 테스트 됨).

app.config(['$httpProvider', function ($httpProvider) {
  //Reset headers to avoid OPTIONS request (aka preflight)
  $httpProvider.defaults.headers.common = {};
  $httpProvider.defaults.headers.post = {};
  $httpProvider.defaults.headers.put = {};
  $httpProvider.defaults.headers.patch = {};
}]);


답변

서비스는 OPTIONS다음과 같은 헤더 로 요청에 응답해야합니다 .

Access-Control-Allow-Origin: [the same origin from the request]
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: [the same ACCESS-CONTROL-REQUEST-HEADERS from request]

다음은 좋은 문서입니다. http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server


답변

같은 문서가 말합니다

위에서 설명한 간단한 요청과 달리, “미리 비행 된”요청은 실제 요청이 안전하게 전송되는지 확인하기 위해 먼저 다른 도메인의 리소스에 HTTP OPTIONS 요청 헤더를 보냅니다. 사이트 간 요청은 사용자 데이터에 영향을 줄 수 있으므로 이와 같이 프리 플라이트됩니다. 특히 다음과 같은 경우 요청이 프리 플라이트됩니다.

GET 또는 POST 이외의 메소드를 사용합니다. 또한 POST를 사용하여 application / x-www-form-urlencoded, multipart / form-data 또는 text / plain 이외의 Content-Type으로 요청 데이터를 보내는 경우 (예 : POST 요청이 서버에 XML 페이로드를 보내는 경우) application / xml 또는 text / xml을 사용하면 요청이 프리 플라이트됩니다.

요청에 사용자 정의 헤더를 설정합니다 (예 : 요청에 X-PINGOTHER와 같은 헤더가 사용됨)

원래 요청이 사용자 지정 헤더없이 가져 오기 인 경우 브라우저는 지금 요청하는 옵션을 요청하지 않아야합니다. 문제는 옵션 요청을 강제로 수행하는 헤더 X-Requested-With를 생성한다는 것입니다. 이 헤더를 제거하는 방법 은 https://github.com/angular/angular.js/pull/1454 를 참조 하십시오 .


답변

이것은 내 문제를 해결했다.

$http.defaults.headers.post["Content-Type"] = "text/plain";


답변

nodeJS 서버를 사용하는 경우이 라이브러리를 사용할 수 있습니다. https://github.com/expressjs/cors

var express = require('express')
  , cors = require('cors')
  , app = express();

app.use(cors());

그리고 당신이 할 수있는 후 npm update.