RackとかRailsでリダイレクトとかがhttpsにならないとき
今日したこと
- いろいろ
短文技術エントリは手抜き。
nginx => railsとかでhttpsをraislに飛ばすときに解く
よくある構成だとおもう。 フロントのWebサーバまではHTTPSで飛ばして、最後のRailsにはHTTPでReverseProxyするってやつ。
そのときにHTTPヘッダをちゃんとNginxで設定しないとRails側がHTTPSで来た通信だということを認識しなくてうまく動かないのはよく知られた話。 X_Forwared_Proto htttps;
とかはちゃんと書こうなって記事に引っかかる。
で。 これで引っかかった。 ちゃんと書いていたのにHTTPSと認識されなかったのは謎。
今回の問題は、 GoogleOmniauthのリダイレクトURLが何故かHTTPになってしまうということ。
コードを漁っていったら、Rackのschemeからhttpsかhttpかを取得していた。
このschemeの部分を見ていたらRails(Rack)がHTTPSできた通信かHTTP出来た通信か調べてるのがわかった。
def scheme if get_header(HTTPS) == 'on' 'https' elsif get_header(HTTP_X_FORWARDED_SSL) == 'on' 'https' elsif get_header(HTTP_X_FORWARDED_SCHEME) get_header(HTTP_X_FORWARDED_SCHEME) elsif get_header(HTTP_X_FORWARDED_PROTO) get_header(HTTP_X_FORWARDED_PROTO).split(',')[0] else get_header(RACK_URL_SCHEME) end end
Rack schmeのここの部分だった。 これでhttpsか判断してるっぽい。 X_FORWARDED_PROTOなどなんかうまくいかなかったので、このコードにしたがって、Nginxで。。。
proxy_add_header X_FORWARDED_SSL on;
みたいにやったら、HTTPSと認識してくれて良しなに動いた。