【问题标题】:Rails 5 ActionController::InvalidAuthenticityToken on Production Enviroment Nginx生产环境 Nginx 上的 Rails 5 ActionController::InvalidAuthenticityToken
【发布时间】:2019-09-25 06:31:57
【问题描述】:

在 Rails 5.2,SSL 环境中,使用 Nginx 作为 reverse_proxy 运行,每当我提交表单时都会收到错误:

HTTP Origin 标头 (https://agro2business.com.br) 不匹配 request.base_url (https://agro2business.com.br, agro2business.com.br)

在 1 毫秒内完成 422 个不可处理的实体(ActiveRecord:0.0 毫秒)

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken)

我在另一个 StackOverflow 问题中阅读了有关配置参数和 Nginx 以传递标头的信息,但到目前为止还没有运气。我的 nginx 配置文件:

proxy_pass http://localhost:4000; }

位置/{

            proxy_pass http://localhost:4000;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            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-Real-Port $server_port;
            proxy_set_header X-Real-Scheme $scheme;
            proxy_set_header X-NginX-Proxy true;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Ssl on;
    }

为什么 Rails 会尝试将标题与两个值进行比较?

request.base_url (https://agro2business.com.br, agro2business.com.br)

【问题讨论】:

  • 你在使用设计吗?
  • @a3y3 是的,我正在使用 Devise gem
  • 很可能是表单中没有传递CSRF token。搜索如何将其包含在您的 POST 请求中。

标签: ruby-on-rails ssl nginx ruby-on-rails-5


【解决方案1】:

我的问题是,在我的 nginx 配置中,我设置了两次标头 Host,这导致 url 生成误导,进而导致表单提交无效。

  proxy_pass http://localhost:4000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        **proxy_set_header Host $http_host;**
        proxy_redirect off;
        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-Real-Port $server_port;
        proxy_set_header X-Real-Scheme $scheme;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Ssl on;

只需删除两个 proxy_set_header Host $http_host; 就可以了

【讨论】:

  • 我没有这个问题(与主机有关),它适用于 Rails 6,但原因是标题中缺少一些东西。当我把你所拥有的一切都放好时,它就可以工作了。弄明白真是令人沮丧:)谢谢!
猜你喜欢
  • 2018-11-02
  • 2017-11-13
  • 2016-11-14
  • 1970-01-01
  • 2017-04-12
  • 2018-11-27
  • 2020-03-11
  • 2017-09-07
  • 2015-11-23
相关资源
最近更新 更多