프록시를 거치게 되면 $http_x_forwarded_proto에 https인지 http인지 여부가 들어간다. 이 값을 이용해서 판단해 주면 된다.
소스는 아래와 같이 된다.
if ($http_x_forwarded_proto != "https") {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
여기서 문제는 내 서비스의 백엔드는 HTTP로 돌아가고 있다는 사실. Google Cloud Load Balancer에는 상태 확인 기능이 있어서 상태가 좋지 않을 경우 서버에서 제외시켜 버린다. 내부에는 SSL이 없어서 HTTP 프로토콜로 상태 확인을 진행하는데 HTTP로 접속할 경우 위 코드대로 한다면 HTTPS로 리다이렉트되어 버린다. 상태 확인은 이를 비정상적인 상태로 인식하여 사이트가 터지는 일이 발생한다. 이를 해결하기 위해서 내부 확인용 host 이름을 이용한 리다이렉트 과정을 추가하려 하였으나, nginx에서는 if문을 중첩시킬수도, AND 연산자를 사용할 수도 없다. 또 다시 구글링이다! 그리고 발견했다!
if ( $http_x_forwarded_proto != "https" ) {
set $test "1";
}
if ( $http_host != "확인용 주소" ) {
set $test "${test}1";
}
if ( $test == "11" ) {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
변수에다가 문자열을 집어넣고, 문자열이 일치하면 리다이렉트 하도록 조건문을 만들었다.
참고글
http://scottwb.com/blog/2013/10/28/always-on-https-with-nginx-behind-an-elb/
https://www.digitalocean.com/community/questions/conditional-within-an-if-in-nginx