nginx 默认转发 expect: 100-continue 头,若后端不支持该协议(如老旧 wsgi 应用),会导致客户端等待超时;proxy_set_header expect "" 可清空该头,从源头规避协商问题。

某些后端服务(如老旧的 Python WSGI 应用、自定义 HTTP 服务或未正确实现 RFC 7231 的服务)不支持或忽略 Expect: 100-continue 请求头,导致客户端(尤其是使用 curl -H "Expect: 100-continue" 或某些 HTTP 客户端库)在发送大请求体前等待 100 Continue 响应,而服务端无响应,最终超时失败。
为什么会出现这个问题
Nginx 默认会将客户端的 Expect 头原样转发给后端。如果后端不处理该头,它可能:
- 直接返回 417 Expectation Failed
- 忽略该头但不发 100 Continue,导致客户端卡住
- 因协议不兼容拒绝连接或返回异常响应
proxy\_set\_header Expect "" 的作用
该指令让 Nginx 在转发请求到后端前,主动清除(覆盖为空字符串)Expect 请求头,从而避免触发 100-continue 协商流程。
注意:proxy_set_header Expect "" 不是删除该头,而是将其值设为空字符串。部分旧版 Nginx 中需配合 proxy_pass_request_headers on(默认开启),确保头被重写而非保留原始值。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
正确配置示例
在 location 或 server 块中添加:
完整典型配置片段:
location /api/ {proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Expect "";
}
无需额外设置 proxy_ignore_client_abort 或调整 client_body_timeout —— 这个指令本身已从源头规避了协商问题。
其他注意事项
- 该设置只影响 Nginx 到后端的请求,不影响客户端到 Nginx 的通信;Nginx 仍可正常响应客户端的 100 Continue(由其自身协议栈处理)
- 若后端实际支持 100-continue 且你希望保留该优化(如大文件上传前校验),则不应禁用;仅在确认后端不兼容时启用
- 某些场景下还需检查
underscores_in_headers on(如果后端依赖带下划线的头名),但Expect是标准头,与此无关










