読者です 読者をやめる 読者になる 読者になる

force_ssl = true 時のリダイレクトループ [Rails]

メモ Rails Nginx

環境 ubuntu: 16.04, rails: 4.2.6, nginx: 1.4.6

Rails において https 通信を強制するには config/environments/production.rb 中の config.force_ssl = true をコメントアウトすればいいが、nginx でも https 転送の設定をしているとリダイレクトの無限ループに陥ってしまう。
nginx だけでも良いのだけれど、リンクやリダイレクトなどの rails 内部の処理が http で処理されるため、それらもいちいち nginx でリダイレクトするのがうっとうしいし、ログも肥大化する。
nginx の設定ファイルを書き換えることで対処できる。
参考: Nginx + SSL + Rails -- BONNOH FRACTION 14
パスは私の環境に依っている。

# /etc/nginx/conf.d/rails.conf
server {

# ...

location @unicorn {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;

  # この行を追加
  proxy_set_header X-FORWARDED_PROTO https;

  proxy_pass http://unicorn;
}

rails と nginx を再起動して、反映させる。