Nginxとrailsで死んだ話

状況

nginxでrailsにproxyしている。

死んだ理由

nginxでrequest hostをrailsに伝えてなかった.

どうゆうことかというとprotect_from_forgeryで以下のmethodが
呼び出されている.
nginxを以下のように設定しないと
request.origin と request.base_url
が異なって死んでしまう.

def valid_request_origin? # :doc:
  if forgery_protection_origin_check
    # We accept blank origin headers because some user agents don't send it.
    raise InvalidAuthenticityToken, NULL_ORIGIN_MESSAGE if request.origin == "null"
    request.origin.nil? || request.origin == request.base_url
  else
    true
  end
end

nginx.conf

upstream puma {
    server unix:///path/to/your_app.sock
}

location / {
    proxy_header Host $http_host;
    proxy_pass http://puma;
}