포스트맨을 통해 개발 서버에 API테스트를 진행하고 있었다.
[POST]dev.example.com/users로 api테스트를 하니 결과는???
405 Method not allowed,,,, 왜지??
로컬에서 진행해보니 매우 잘되었다.
레퍼런스도 막 뒤져보고
error_page 405 =200 $uri;
처럼 서버 설정에도 이렇게 추가해줬지만, 소용없었다.
그런데,,,
다른 api를 테스트하다가 분명 POST요청을 했는데 GET으로 통신이되서 또 다른 api의 결과값이 나오는 것을 보고, 실마리가 이곳에 있을 것같다는 생각을 했다.
알고보니,,,,
dev.example.com을 301로 http://$host$request_uri로 리디렉션 리턴하게 설정해주었는데 301은 GET요청만 인식한다,,,,,
307은 302와 유사하고, 308은 301과 유사하다.
다만 차이점이 있다면 전송 받은 HTTP Method를 유지한다는 것이다.
301과 302는 redirect 시킬 때 method를 get으로 바꿔서 전송한다.
따라서 get 요청을 보낼 때는 문제가 없지만 post 메소드를 요청했을 때 문제가 발생할 수 있다.
http to https redirect를 구현할 때 301 또는 302 상태 코드를 쓰게 되면
http 프로토콜을 통해 post 메소드로 날아온 게 https 프토토콜을 통해 get 메소드로 변경되면서 컨트롤러나 라우터에 매핑되는 URI가 없어서 오류가 나게 된다.
따라서 301 대신에 308을, 302 대신에 307을 쓰면 좀 더 안전하게 redirect 시킬 수 있다.
또한 이제 301과 302를 redirect라는 명칭으로 부를 수도 없다.
301은 Moved Permanently로, 302는 Found로 명칭이 변경되었다.
해결책 2가지 방법
도메인 앞에 https://를 붙여주고 api 테스트를 한다.
리디렉션 301 -> 308로 변경해줘서 http 메소드를 보장해준다.