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

Ruby Sinatra POST请求携带较大JSON payload触发RangeError问题咨询

问题根源

你配置的Rack::Utils.key_space_limit仅作用于表单格式的请求参数,对JSON类型的raw请求体不生效。触发RangeError以及日志出现陌生IP的原因都和服务部署结构有关:

  1. 体积超过阈值的请求被前置的反向代理/CDN拦截,或者被JSON解析器的默认大小限制拦截
  2. 日志中的陌生IP是反向代理/CDN节点的出口IP,而非真实请求发起方的IP

修复步骤

  • 调整反向代理请求体限制
    如果服务前部署了Nginx等反向代理,在对应站点配置的server或location块中添加如下配置,按需调整允许的最大请求体大小:
    client_max_body_size 10M;
    
    其他反向代理或CDN服务也对应调整允许的POST请求体上限即可。
  • 显式放宽JSON解析限制
    修改路由中的JSON解析代码,手动指定解析参数,避开默认的大小、嵌套深度限制:
    post '/calc' do
      request.body.rewind # 确保请求体未被前置中间件消费后无法读取
      rad_data = JSON.parse(
        request.body.read,
        max_nesting: 1000, # 按需调整最大嵌套深度,特殊场景可设为false关闭检测
        allow_nan: true, # 如果payload中存在NaN/Infinity等特殊浮点数值需要开启
        limit: 10*1024*1024 # 设置最大允许解析的JSON大小为10MB,按需调整
      )
      # 后续计算逻辑
    end
    
    如果你使用Oj等第三方JSON解析库,对应调整其max_nesting、mode等相关参数即可。
  • 配置代理信任获取真实IP
    在Sinatra启动代码中添加代理信任配置,即可正常读取真实客户端IP:
    # 信任本地及代理节点的IP,支持填写单个IP或者IP段
    set :trust_proxy, ['127.0.0.1/8', '78.110.164.58']
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:36:04