如何配置Nginx使请求头或Cookie过大时返回431而非400状态码
方案有效性说明
你找到的map $status $status_text配置仅能自定义状态码对应的文本描述,无法修改Nginx实际返回的HTTP状态码,单独使用该配置无法实现你的需求。
最简单的实现方式
你可以通过Nginx的error_page指令结合错误信息匹配,精准将「请求头/Cookie过大」场景的400状态码改写为431,其余场景的400错误不受影响,配置步骤如下:
- 在
http块中新增如下映射规则,用于识别需要改写状态码的错误场景:
http { # 原有配置保持不变 include /etc/nginx/mime.types; default_type application/octet-stream; # 新增如下配置 map $errormsg $custom_status { default ""; ~*"Request Header Or Cookie Too Large" 431; } map $status $status_text { 431 'Request Header Fields Too Large'; } include /etc/nginx/conf.d/*.conf; }
- 在对应业务的
server块中新增错误捕获规则:
server { # 原有配置保持不变 large_client_header_buffers 4 32k; # 新增如下配置 error_page 400 =$custom_status @rewrite_header_error; location @rewrite_header_error { # 非请求头过大的400错误保持原状态码返回 if ($custom_status = "") { return 400; } add_header Content-Type text/html; return 431 '<html> <head><title>431 Request Header Fields Too Large</title></head> <body> <center><h1>431 Bad Request</h1></center> <center>Request Header Or Cookie Too Large</center> <hr><center>nginx</center> </body> </html>'; } }
- 执行配置校验和重载生效:
nginx -t && nginx -s reload
简化方案(无需区分其他400错误时使用)
如果你不需要保留其他场景的400状态码,可以去掉错误信息匹配逻辑,直接全局改写:
server { error_page 400 =431 /431.html; # 可自定义431返回内容或直接指向静态错误页 }
内容的提问来源于stack exchange,提问作者Alex Kuzminov
相关产品推荐
相关产品推荐

