Django如何返回自定义HTTP状态文本以适配App端Bug?
自定义HTTP 429响应状态消息的解决方法
核心问题分析
你得到的h2 200结果,本质是当前请求用了HTTP/2协议——HTTP/2设计时移除了状态原因短语(即TOO_MANY_REQUESTS或你要的CUSTOM_MESSAGE部分),仅传输状态码;同时可能存在代理或框架拦截了你的429响应,强制返回了200。
具体解决步骤
强制使用HTTP/1.1协议
HTTP/1.1支持自定义状态原因短语,需确保请求和响应都走HTTP/1.1:- 若用Nginx代理,在对应location块禁用HTTP/2:
listen 443 ssl; # 去掉http2参数 return 429 "CUSTOM_MESSAGE"; - 若为后端代码(如Java Tomcat),直接设置状态码和原因短语:
HttpServletResponse response = ...; response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); response.setReasonPhrase("CUSTOM_MESSAGE");
- 若用Nginx代理,在对应location块禁用HTTP/2:
排查中间件拦截
检查CDN、反向代理(如Cloudflare、APIGateway)是否有拦截429响应的规则,这类服务常默认把429转换为自定义页面或200响应,需在控制台关闭相关拦截策略,允许透传原始响应。兼容HTTP/2的替代方案
若无法放弃HTTP/2,推荐在响应体中携带自定义消息,这是现代API的标准做法:{ "status_code": 429, "error_message": "CUSTOM_MESSAGE" }让App端读取响应体中的
error_message字段,而非依赖状态行的原因短语。
内容的提问来源于stack exchange,提问作者stick Cour
相关产品推荐
相关产品推荐

