要让前端通过eventsource成功建立跨域sse长连接,nginx必须关闭proxy_buffering和proxy_cache、设置proxy_read_timeout 86400、启用http/1.1长连接、透传text/event-stream响应头,并始终添加access-control-allow-origin等cors头。

要让前端页面通过 EventSource 成功建立跨域 SSE 长连接,Nginx 的配置不能只套用普通 API 的 CORS 模板——SSE 是长生命周期的 GET 流式请求,对超时、缓冲、响应头透传和连接保持有特殊要求。漏掉任一环节,都会出现“连接60秒断开”“data 不显示”或“CORS 报错”等问题。
必须关闭代理缓冲与缓存
SSE 要求服务端逐块推送 data: xxx\n\n,而 Nginx 默认开启 proxy_buffering on,会攒满 4KB 或等响应结束才转发,导致前端“卡住”。同时 SSE 内容不可缓存:
-
proxy_buffering off;—— 强制实时透传每一块数据 -
proxy_cache off;—— 禁用所有缓存(SSE 本质是动态流) -
proxy_hide_header X-Accel-Buffering;—— 防止 Nginx 注入干扰头 -
chunked_transfer_encoding on;—— 显式启用分块传输(Nginx ≥ 1.13.6 推荐)
必须延长超时并保持 HTTP/1.1 长连接
默认 proxy_read_timeout 60 是 SSE 断连的最常见原因;浏览器 EventSource 依赖连接长期存活,而非单次响应快慢:
-
proxy_read_timeout 86400;—— 设为 24 小时(按业务最长空闲间隔调整) -
keepalive_timeout 86400;—— 匹配,避免内核回收底层 TCP 连接 -
proxy_http_version 1.1;—— 强制使用 HTTP/1.1 支持 keep-alive -
proxy_set_header Connection '';—— 清除 Connection 头,防止中间设备强制断连
必须正确透传并补充 SSE 关键响应头
浏览器只认 Content-Type: text/event-stream 和 Cache-Control: no-cache,且这些头易被 Nginx 过滤或覆盖:
-
proxy_pass_request_headers on;—— 确保 Origin 等头传给后端,用于鉴权 -
proxy_hide_header Cache-Control;—— 防止 Nginx 覆盖后端设置 -
add_header Content-Type "text/event-stream" always;—— 若后端未设,Nginx 补充(优先保证后端输出) -
add_header Cache-Control "no-cache" always;—— 明确禁止缓存
必须稳定提供跨域头(含 OPTIONS 预检支持)
SSE 跨域不触发预检(浏览器直接发 GET),但 CORS 头仍需由 Nginx 稳定输出——后端返回的 Access-Control-Allow-Origin 可能被 Nginx 默认过滤:
-
add_header Access-Control-Allow-Origin "*" always;—— 生产环境请替换为具体域名 -
add_header Access-Control-Allow-Credentials "true" always;—— 若前端设withCredentials: true,则 Origin 不能为* add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept" always;-
必须加
if ($request_method = 'OPTIONS') { ... return 204; }块 —— 虽然 SSE 不走预检,但其他接口可能共用 location,避免 OPTIONS 请求穿透到后端失败
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











