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; }