Nginx 转发 OPTIONS 请求时需关闭代理缓冲并优化传输行为:用 map 动态关闭 buffering,设 HTTP/1.1、清空 Connection 头、添加 Content-Length 0;限制缓冲区大小并禁用临时文件缓存;CORS 头须由后端返回或由 Nginx 兜底注入。

如果 Nginx 不拦截 OPTIONS 请求(即不写 return 204),而是选择转发给后端,就必须特别注意缓冲区行为——因为 OPTIONS 响应极短(通常无响应体、仅含状态码和 CORS 头),默认的 proxy_buffering 容易误判、卡住连接或引入延迟。
关闭 OPTIONS 请求的代理缓冲
避免 Nginx 等待“更多响应数据”,需对 OPTIONS 方法显式关闭缓冲:
- 用
map指令动态设置开关:map $request_method $proxy_buffering_flag {<br> OPTIONS off;<br> default on;<br>} - 在 proxy location 中引用:
proxy_buffering $proxy_buffering_flag; - 确保该 map 声明在
http块顶层,且早于所有 server/location 加载
强制立即发送、避免 HTTP/1.0 兼容干扰
即使关闭 buffering,Nginx 仍可能因协议协商延迟发送。需同步收紧传输行为:
- 指定 HTTP/1.1 协议:
proxy_http_version 1.1; - 清除 Connection 头防止降级:
proxy_set_header Connection ''; - 显式声明空响应长度(尤其后端未返回
Content-Length: 0):add_header Content-Length 0 always;
收紧缓冲区参数,防小响应滞留
若因业务必须保留部分 buffering(如混合方法共用 location),则需限制缓冲资源,避免 OPTIONS 被“裹挟”进大缓冲池:
-
proxy_buffer_size 4k;—— 控制首块缓冲大小 -
proxy_buffers 4 4k;—— 总缓冲上限 16KB,足够承载纯头响应 -
proxy_busy_buffers_size 8k;—— 防止小响应占用过多活跃缓冲 - 禁用临时文件缓存(OPTIONS 不需要落盘):
proxy_buffering off;优先于以上参数
确保 CORS 头可靠透传或注入
转发模式下,CORS 头必须由后端正确返回;若后端不可控,Nginx 需兜底注入(注意 always):
add_header Access-Control-Allow-Origin "*" always;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,Content-Type,Authorization" always;- 这些指令必须放在 proxy location 内,且不能被 if 块包裹(除非 Nginx ≥ 1.7.0)


















