Elixir Phoenix应用请求头超4000字符返回431错误如何配置修复?
Phoenix 默认使用 Cowboy 作为Web服务器,其默认总请求头大小、单请求头值上限均为4KB,当顶级域名下共享的全局Cookie累积过多时,会超出默认阈值触发431 Request Header Fields Too Large 错误,可通过以下步骤调整配置:
1. 调整Phoenix服务端配置
打开项目对应环境的配置文件,生产环境修改 config/prod.exs,需全环境生效修改 config/config.exs:
- 在Endpoint配置块中新增http/https配置项,调整请求头相关参数,单位为字节:
# 替换下方的your_app_name、YourAppNameWeb为你实际的应用命名空间 config :your_app_name, YourAppNameWeb.Endpoint, # 保留原有url、cache_static_manifest等配置不变,新增/修改http配置 http: [ port: System.get_env("PORT") || 4000, max_header_name_length: 64, max_header_value_length: 16384, # 单请求头值最大16KB,可根据实际Cookie大小调整 max_headers: 100, max_request_line_length: 16384 ], # 若直接使用Phoenix开启HTTPS服务,同步添加以下https配置 https: [ port: 443, cipher_suite: :strong, keyfile: System.get_env("SSL_KEY_FILE_PATH"), certfile: System.get_env("SSL_CERT_FILE_PATH"), max_header_name_length: 64, max_header_value_length: 16384, max_headers: 100, max_request_line_length: 16384 ]
2. 调整反向代理层配置(如有)
如果你的站点前置了Nginx、Caddy等反向代理服务,需要同步调整代理层的请求头限制,避免限制在代理层触发:
- Nginx 配置参考,在server块中添加:
large_client_header_buffers 4 16k; - 需确保代理层的请求头限制值大于等于Phoenix侧的配置值。
注意事项
不要将请求头限制设置得过大,过高的阈值会提升服务器被慢速HTTP攻击的风险,建议根据站点实际Cookie平均大小增加20%~30%冗余即可,通常16KB的单请求头值上限足以覆盖绝大多数大型域名的Cookie场景。
内容的提问来源于stack exchange,提问作者Topher Hunt
相关产品推荐
相关产品推荐

