10

다른 호스트/URL에있는 편안한 웹 서비스에 모델을 저장하려고하면 내 backbone.js 응용 프로그램에서 HTTP OPTIONS를 찾을 수 없음 오류가 발생합니다.Phil Sturgeon의 Codeigniter Restserver 및 Backbone.js의 HTTP OPTIONS 오류

는 요청이 끊임없이 옵션의 HTTP 요청 헤더를 전송하고, 전혀 POST 요청을 트리거하지 않습니다 :

내 연구를 바탕으로,이 post에서 모였다.

"사용자 데이터에 부작용을 일으킬"요청이있는 CORS는 실제로 의도 한 HTTP 요청 방법을 보내기 전에 브라우저가 OPTIONS 요청 헤더로 요청을 "미리 비행"하여 승인을 확인합니다.

  • true로 백본에 emulateHTTP을 Settting :

나는하여 해결하기 위해 노력했다.

Backbone.emulateHTTP = true;

  • 는 또한 헤더의 모든 CORS 및 CSRF 옵션을 사용할 수있었습니다.

    헤더 ('Access-Control-Allow-Origin : *');
    헤더 ("Access-Control-Allow-Headers : 발신지, X-Requested-With, Content-Type, Accept"); 헤더 ("액세스 제어 허용 방법 : GET, POST, OPTIONS");

Backbone.emulateHTTP 코드 줄이 도입되면 응용 프로그램이 충돌했습니다.

CodeIgniter RESTServer의 OPTIONS 요청에 응답하는 방법이 있습니까?이 요청을 대화 위치에서 비활성화 할 수있는 다른 방법이 있습니까?


나는 하나의 해결책으로 this on Github을 발견했다. 조금 오래된 것 같아서 사용해야하는지 잘 모르겠습니다.

답변

28

정확히 동일한 문제가 발생했습니다. 이 문제를 해결하기 위해 코어에 MY_REST_Controller.php가 있고 모든 REST API 컨트롤러는이를 기본 클래스로 사용합니다. OPTIONS 요청을 처리하기 위해 이처럼 생성자를 추가하기 만하면됩니다.

function __construct() { 

    header('Access-Control-Allow-Origin: *'); 
    header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method"); 
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE"); 
    $method = $_SERVER['REQUEST_METHOD']; 
    if($method == "OPTIONS") { 
     die(); 
    } 
    parent::__construct(); 
} 

이것은 단지 요청 유형은 OPTIONS이고 그래서 그냥 죽으면 요청하는 부호 (200)를 반환하는 경우에 체크한다.

+0

완벽! 감사! –

+0

시간을 검색 한 후; 이것이 해결책이었습니다.감사합니다 :) –

+0

그 위에 우리는 "Access-Control-Allow-Origin"을 헤더 ('Access-Control-Allow-Origin :'. $ _SERVER [ 'HTTP_ORIGIN'])와 같이 추가 할 수 있습니다. 여기에서 API에 대한 도메인 액세스 허용을 선택할 수 있습니다. –

6

하위 메서드의 $allowed_http_methods 속성을 수정하여 옵션 방법을 제외 할 수도 있습니다. REST_controller 이전 버전의 옵션와 아무것도하지 않았다이 줄을 추가하는 것은 그 행동을 모방하는 것 같다

protected $allowed_http_methods = array('get', 'delete', 'post', 'put'); 
+0

해결 [AngularJS가있는 POST 요청이 CodeIgniter ResetServer가있는 프리 플라이트 OPTION 상태 코드 = 404와 함께 실패 함] (0120-337-005) –

+0

이것은 더 높은 순위의 답변보다 훨씬 깔끔합니다. +1 –