ELB 使ってる時と使ってない時で nginx の X-Forwarded-Proto を変える

https かどうかをサーバ側で判断したいんだけど、ELB 経由で nginx に繋いでいるか、直接 nginx に繋いでいるかで値が変わってくるのでどうしようかなと思って調べた。

ELB 経由の場合は ELB で https を受け取って、後ろに http で投げてくる。
$scheme = http, $http_x_forwarded_proto = https
な状態。
直接 nginx に繋いでいる場合は
$scheme = https, $http_x_forwarded_proto = ''
な状態。

ということで、 server ブロックの外で

map $http_x_forwarded_proto $my_forwarded_proto {
  default $http_x_forwarded_proto;
  ''      $scheme;
}

と書いて、「default で $http_x_forwarded_proto の値を使うんだけど、空の時は $scheme 見る」みたいにして、 server ブロックの中で

location / {
   proxy_set_header X-Forwarded-Proto $my_forwarded_proto;
   proxy_pass http://backend_node;
}

と書いて解決した。

参考
stackoverflow.com