안녕하세요.
Q&A에 관련 질문을 올렸지만 해결이 안되어 CI에서 직접 CORS 설정을 해 보고 있습니다.
Nginx에서 어떤 설정을 하던 마지막에는 404에러가 나는데, 이 부분은 CI의 설정문제로 보여져서,
순수하게 CI의 설정만으로 아래와 같이 시도해 봤습니다.
오류는 405 Status :: Method Not Allowed 로 출력이 됩니다.
요청.응답 헤더에는 모두 있는데, preflight의 Option 때문에 그런것인지요?
설정을 어떻게 바꿔야 정상적으로 통신이 될까요?
* REST_Controller.php
/**
* List of allowed HTTP methods
*
* @var array
*/
protected $allowed_http_methods = ['get', 'delete', 'post', 'put', 'options', 'patch', 'head'];
* Login.php
/*
|--------------------------------------------------------------------------
| Login controller
|--------------------------------------------------------------------------
*/
class Login extends REST_Controller {
function __construct(){
if (isset($_SERVER['REQUEST_URI'])) {
$req_uri = explode('/',$_SERVER['REQUEST_URI']);
if ($req_uri[1] == API_URI) {
get_config(array('csrf_protection' => false));
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();
}
.....생략
* Client Ajax
var reqData = '{"mb_id":"5n_id","mb_pw":"1234"}';
$.ajax({
type: 'POST',
url: 'https://api.mydomain.com/member/login',
crossDomain : true,
processData: false,
async: false,
cache: false,
contentType: 'application/json; charset=UTF-8',
data: reqData,
dataType: 'json',
success: function(data) {
console.log(data);
}, // Success Function
error: function(xhr, response){
console.log("Error code is " + xhr.status + " and the error is " + response);
}
});
* Header 비교
HTTP/2.0 405 Method Not Allowed date: Tue, 28 Nov 2017 06:59:24 GMT content-type: application/json; charset=utf-8 server: nginx/1.10.3 (Ubuntu) access-control-allow-origin: * access-control-allow-headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method access-control-allow-methods: GET, POST, OPTIONS, PUT, DELETE content-encoding: gzip vary: Accept-Encoding X-Firefox-Spdy: h2
OPTIONS /member/login HTTP/1.1 Host: api.mydomain.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Access-Control-Request-Method: POST Access-Control-Request-Headers: content-type Origin: https://web.mydomain.com Connection: keep-alive
답변 감사합니다.
답변 내용을 보고 힌트를 얻어 코드 확인해 보니 response의 REST_Controller에 404를 주어 내보내더군요.(다른 개발자가 개발해 놓음 ㅠㅠ)
이런줄 모르고 삽질을,,,,