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

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重定向。

解决步骤:

  1. 修改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;
    }
    
  2. 配置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。

解决步骤:

  1. 保留Nginx的HTTPS跳转配置(同上述HTTP重定向规则)
  2. 配置Rails信任代理(同上述trusted_proxies配置)
  3. 关闭Rails的force_ssl:
    config.force_ssl = false
    
    此时Rails会根据X-Forwarded-Proto头正确识别请求协议为HTTPS,生成的request.base_url会与Origin头一致。

验证操作

  1. 重启Nginx容器:docker exec <nginx容器名> nginx -s reload
  2. 重启Rails容器:docker restart <Rails容器名>
  3. 访问http://localhost,确认自动跳转至HTTPS且无重定向循环,同时检查接口请求的Origin与request.base_url是否匹配。

内容的提问来源于stack exchange,提问作者Morris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:39:53