Docker化Rails+Puma+Nginx应用出现ERR_TOO_MANY_REDIRECTS求助
解决Docker化Rails+Puma+Nginx的重定向循环与Origin不匹配问题
一、修复ERR_TOO_MANY_REDIRECTS(开启Rails force_ssl 时)
问题根源在于两点:
- Nginx未将80端口的HTTP请求强制跳转至HTTPS,导致HTTP请求进入Rails后,
force_ssl=true触发重定向,但用户若仍访问80端口会形成循环。 - Rails默认不信任代理发送的
X-Forwarded-Proto头,即便Nginx设置了该头,Rails仍会判定请求为HTTP,进而重复触发SSL重定向。
解决步骤:
修改Nginx配置,强制HTTP跳转至HTTPS
更新配置文件,拆分HTTP和HTTPS的server块:upstream kisoul { server rails:3000; } # 处理HTTP请求,强制跳转至HTTPS server { listen 80; server_name localhost; # 替换为你的实际域名 return 301 https://$host$request_uri; } # 处理HTTPS请求 server { listen 443 ssl; root /usr/share/nginx/kisoul; server_name localhost; # 替换为你的实际域名 try_files $uri @kisoul; location @kisoul { proxy_pass_request_headers on; proxy_ignore_headers Expires Cache-Control; proxy_set_header Host $http_host; proxy_pass_header Set-Cookie; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://kisoul; } ssl_certificate /etc/nginx/fullchain.pem; ssl_certificate_key /etc/nginx/privkey.pem; }配置Rails信任代理,识别
X-Forwarded-Proto头
在config/application.rb或对应环境配置文件(如config/environments/production.rb)中添加:config.force_ssl = true # 信任Docker网络中的Nginx代理,可根据实际网络段调整 config.action_dispatch.trusted_proxies = ['0.0.0.0/0', '::/0'] # 更严格的写法(以Docker默认桥接网络为例): # config.action_dispatch.trusted_proxies = IPAddr.new('172.17.0.0/16')
二、修复Origin头不匹配问题(关闭Rails force_ssl 用Nginx跳转时)
关闭force_ssl后出现Origin与request.base_url不匹配,是因为Rails未识别代理传递的HTTPS协议,导致生成的URL使用HTTP。
解决步骤:
- 保留Nginx的HTTPS跳转配置(同上述HTTP重定向规则)
- 配置Rails信任代理(同上述
trusted_proxies配置) - 关闭Rails的
force_ssl:
此时Rails会根据config.force_ssl = falseX-Forwarded-Proto头正确识别请求协议为HTTPS,生成的request.base_url会与Origin头一致。
验证操作
- 重启Nginx容器:
docker exec <nginx容器名> nginx -s reload - 重启Rails容器:
docker restart <Rails容器名> - 访问
http://localhost,确认自动跳转至HTTPS且无重定向循环,同时检查接口请求的Origin与request.base_url是否匹配。
内容的提问来源于stack exchange,提问作者Morris
相关产品推荐
相关产品推荐

