You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes代理环境下Ruby on Rails应用CSRF令牌丢失及422错误求助

问题:Rails应用部署到K8s后登录出现422 CSRF错误

场景描述

本地Docker构建并运行Ruby-On-Rails应用时,localhost:3000可正常启动,登录页面能成功登录。但将代码发布到Docker仓库并部署到Kubernetes集群后,登录请求返回422 Unprocessable Entity错误。

错误截图

错误状态码:

Status Code: 422 Unprocessable Entity

调试差异

本地和生产环境的浏览器网络面板均能看到Cookie,但生产环境Cookie缺失csrftoken字段:

本地环境Cookie

csrftoken=7tzlvuigfaUatDBMTEJUBE53OREXHxOJ1ZzJ8h4cuHvnvUza0xLH2lglIFZ1gS4S; __profilin=p=t; _app_session=BBr2bnKi6qYJwW4yvQUU0J3Q2K8JW2i9DZ5zJS0qQmCc48uRNbPrThJhbzhnGXrxLDwD/Y8ZAW5w/x2VhXeotq3TWjWcjVucUzNPA6u6ePMcN8O7XVfcIwV2HR/aGpJ1oxB1B/TbsAcfB4LaSqckVWMZ70anWDOD+xFz0xkKPiOkd++NwnMuWix2TyaicqXmQ+JsK1yWacS2dnTWvC70xyX38JjuC/VUqu2hUFIQHeNuK7Gfp7lMCh0MEJeob43lFhgFZLOJXTC+rPYIUxMTN3aIwD0=--LsM3EqEzNEglvj6H--RHcx/5CRIYG/CWJMUER1eQ==

生产环境Cookie

__profilin=p=t; _app_session=FWpoSIJ8zzB8nkRsF2A30f552HjyAVlwbMva/HN4vnKaTECnPWzfWoc/+P9k/xO+fpmd2j9ntxLFOnflB5vttwxpLL1RtjZWcPmpCWfdR0nqG3EOLPLK9yR0xrvmfKMbFsYeJ2F/hZrJIs+4iOO92CioXo1s51sZX5E3R6c9XIKn5NjHUKWKuEArVV/4MibTg/CSqPWyH3lg1bjxKoZvixSZUBdtxTq1sW5NKsJnnwPgC0ZSkQzsSquCwcxKEf9L1wPxgZQTLGRREY7JeD/+mUc0WL4=--n+JNO4hoF17EGI5K--vY2DcanQEF7ICpZwDxq9tg==

即使将生产环境的RAILS_ENV设置为development,仍会出现422错误。

架构说明

所有流量先经过运行Apache2的门户代理服务器(负责处理域名SSL证书),再通过HTTP转发到内部网络,Nginx-Ingress-Controller仅处理内部HTTP流量。已尝试配置Nginx和Apache的请求头来处理CSRF请求,但问题未解决。

日志排查结果

查看Rails日志发现关键警告:

I, [2022-12-12T08:16:40.202890 #1]  INFO -- : [f785b7f7f797c67c0ab0f008e8a0eb83] Started POST "/login" for 192.168.1.10 at 2022-12-12 08:16:40 +0000                                                    
I, [2022-12-12T08:16:40.204343 #1]  INFO -- : [f785b7f7f797c67c0ab0f008e8a0eb83] Processing by AuthController#login as HTML                                                                             
I, [2022-12-12T08:16:40.204460 #1]  INFO -- : [f785b7f7f797c67c0ab0f008e8a0eb83]   Parameters: {"authenticity_token"=>"[FILTERED]", "login"=>{"email"=>"myemail@gmail.com", "password"=>"[F
W, [2022-12-12T08:16:40.204795 #1]  WARN -- : [f785b7f7f797c67c0ab0f008e8a0eb83] HTTP Origin header (https://my.site.com) didn't match request.base_url (http://my.site.com)                  
I, [2022-12-12T08:16:40.205536 #1]  INFO -- : [f785b7f7f797c67c0ab0f008e8a0eb83] Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms | Allocations: 192)                                     
F, [2022-12-12T08:16:40.207591 #1] FATAL -- : [f785b7f7f797c67c0ab0f008e8a0eb83]

当前配置信息

Ingress资源配置

annotations:
    nginx.org/proxy-connect-timeout: 3600s
    nginx.org/proxy-read-timeout: 3600s
    nginx.org/proxy-send-timeout: 3600s
    nginx.org/proxy-pass-headers: "Set-Cookie"
    nginx.ingress.kubernetes.io/proxy-body-size: "8g"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "Host              $http_host";
      more_set_headers "X-Real-IP         $remote_addr";
      more_set_headers "X-Forwarded-Proto $scheme";
      more_set_headers "X-Forwarded-For   $proxy_add_x_forwarded_for";

Apache配置

<VirtualHost *:80>

    ServerName my.site.com

    ProxyRequests Off
    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>

    ProxyPreserveHost on
    ProxyPass / http://192.168.1.8/
    ProxyPassReverse / http://192.168.1.8

        RewriteEngine on
        RewriteCond %{SERVER_NAME} =my.site.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

<IfModule mod_ssl.c>

        <VirtualHost *:443>

                ServerName my.site.com

                ProxyRequests Off
                <Proxy *>
                  Order deny,allow
                  Allow from all
                </Proxy>

                SSLProxyEngine On
                SSLProxyCheckPeerCN on
                SSLProxyCheckPeerExpire on

                ProxyPreserveHost on
                ProxyPass / http://192.168.1.8/
                ProxyPassReverse / http://192.168.1.8

                Include /etc/letsencrypt/options-ssl-apache.conf

                ErrorLog /var/log/apache2/sites/my.site.com/error.log
                CustomLog /var/log/apache2/sites/my.site.com/access.log combined

                SSLCertificateFile /etc/letsencrypt/live/my.site.com/fullchain.pem
                SSLCertificateKeyFile /etc/letsencrypt/live/my.site.com/privkey.pem
        </VirtualHost>

</IfModule>

已尝试在Apache配置中添加RequestHeader set X-Forwarded-Proto "https",但无任何变化。

提问

需要修改哪些配置才能解决该CSRF问题?


内容的提问来源于stack exchange,提问作者A. Vreeswijk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:20:32