You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fastify-SSE部署Nginx后Server-Sent Events跨域请求失败问题

解决Nginx反向代理下Fastify SSE跨域失败问题

问题根源分析

你遇到的问题核心是SSE请求带自定义Authorization头时,浏览器会触发OPTIONS预检请求,而Nginx或Fastify的配置未正确处理这种场景,同时SSE本身需要特定的响应头来维持长连接,这些配置在本地环境不需要,但Nginx反向代理时必须明确设置。

具体修复步骤

1. 调整Fastify插件注册顺序

CORS插件需要在SSE插件之前注册,确保CORS钩子能覆盖SSE路由:

import fastifyCors from "@fastify/cors";
import FastifySSEPlugin from "fastify-sse-v2";

// 先注册CORS,再注册SSE
await this.instance.register(fastifyCors, { 
  origin: "https://your-frontend-domain.com", // 替换为实际前端域名,带自定义头时*不生效
  allowedHeaders: ["Authorization"], // 明确允许Authorization头
  methods: ["GET", "OPTIONS"] // 包含预检请求的OPTIONS方法
});
await this.instance.after();
await this.instance.register(FastifySSEPlugin, { logLevel: "debug" });

注意:当请求带自定义头(如Authorization)时,浏览器不允许CORS origin设为*,必须指定具体域名,否则预检请求会失败。

2. 配置Nginx支持SSE和跨域

在Nginx的server块中添加针对SSE路由的配置,确保转发时保留必要的头并禁用缓存:

location /transaction/events {
  # 跨域相关头
  add_header Access-Control-Allow-Origin https://your-frontend-domain.com;
  add_header Access-Control-Allow-Methods GET,OPTIONS;
  add_header Access-Control-Allow-Headers Authorization;
  
  # SSE长连接必需的配置
  add_header Cache-Control no-cache;
  add_header Connection keep-alive;
  add_header Transfer-Encoding chunked;
  
  # 禁用Nginx缓存和缓冲,避免SSE消息被积压
  proxy_cache off;
  proxy_buffering off;
  proxy_set_header Connection '';
  proxy_http_version 1.1;
  
  # 转发到你的Fastify服务地址
  proxy_pass http://localhost:3000; # 替换为实际Fastify端口
}

如果你的Nginx全局有CORS配置,需要确保这个location块的配置不会被覆盖,或者直接在全局配置中包含SSE所需的头。

3. 验证预检请求

用浏览器开发者工具的Network面板,查看OPTIONS请求的响应头:

  • 必须包含Access-Control-Allow-Origin、Access-Control-Allow-Headers、Access-Control-Allow-Methods
  • 响应状态码应为204或200

如果OPTIONS请求失败,优先检查Nginx和Fastify的CORS配置是否一致。

内容的提问来源于stack exchange,提问作者Tbaut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:15:33