当前位置: 首页 > news >正文

CORS 跨域问题 Next.js 跨域问题放通

解决 Next.js 跨域问题全记录:next.config.js 配置实战


问题背景

在前后端分离开发中,前端(Next.js)运行在 localhost:3000,后端 API 服务在 http://127.0.0.1:8999 时,浏览器会因 同源策略(Same-Origin Policy) 拦截跨域请求,抛出如下错误:

Access to fetch from 'http://localhost:3000' to 'http://127.0.0.1:8999/api/data' has been blocked by CORS policy.

解决方案

通过 Next.js 的 服务端响应头配置,在 next.config.js 中动态注入 CORS 头信息,放行指定来源的请求。

配置代码示例
// next.config.js
module.exports = {async headers() {return [{// 匹配所有 /api 开头的请求路径source: "/api/:path*",headers: [// 允许携带 Cookie 等凭证{ key: "Access-Control-Allow-Credentials", value: "true" },// 放行指定来源(避免使用通配符*){ key: "Access-Control-Allow-Origin", value: "http://127.0.0.1:8999" },// 允许的 HTTP 方法{ key: "Access-Control-Allow-Methods", value: "GET,DELETE,PATCH,POST,PUT,OPTIONS" },// 允许的自定义请求头{ key: "Access-Control-Allow-Headers", value: "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, Authorization"}],},];},
};

关键配置解析
配置项作用说明
source: "/api/:path*"匹配所有以 /api 开头的路由(如 /api/user
Access-Control-Allow-Credentials允许携带 Cookie、Authorization 等凭证
Access-Control-Allow-Origin精确指定来源(避免用 *,否则无法携带凭证)
Access-Control-Allow-Methods声明服务端支持的 HTTP 方法
Access-Control-Allow-Headers允许客户端发送的自定义头(如 Authorization 用于 JWT 鉴权)

注意事项
  1. 避免使用通配符 *

    • 若配置 Access-Control-Allow-Origin: *,浏览器会拒绝携带凭证的请求(如 Cookies)。
    • 必须明确指定 value: "http://127.0.0.1:8999"(末尾无斜杠)。
  2. 路径匹配规则

    • source: "/api/:path*" 匹配:
      • /api/data
      • /api/user/profile
      • /internal-api(不匹配)
  3. 生产环境调整

    • 部署时需将来源替换为真实域名:
      value: process.env.NODE_ENV === "production" ? "https://your-production-domain.com" : "http://127.0.0.1:8999"
      

验证配置是否生效

使用 curl 测试响应头:

curl -I http://localhost:3000/api/test

输出应包含:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://127.0.0.1:8999
Access-Control-Allow-Methods: GET,DELETE,PATCH,POST,PUT,OPTIONS

常见问题排查
  • Q:配置后仍提示跨域错误?

    • 检查来源地址是否与配置 完全一致(如协议、端口)。
    • 确保后端未重复设置 CORS 头(可能导致冲突)。
  • Q:OPTIONS 预检请求失败?

    • 确认 Access-Control-Allow-Methods 包含 OPTIONS 方法。
    • 检查 Access-Control-Allow-Headers 是否覆盖了请求头。

总结

通过定制 next.config.jsheaders() 方法,我们精准控制了 CORS 策略,实现了安全的前后端协作开发。此方案避免了引入额外中间件,保持 Next.js 项目简洁性。完整配置见 Next.js 官方文档。

提示:若项目使用 App Router,此配置同样生效;需重启服务使配置生效(npm run dev)。

http://www.lryc.cn/news/614634.html

相关文章:

  • 《从零构建大语言模型》学习笔记2,文本数据处理1(以及tiktoken库无法下载gpt2参数,调用get_encoding时SSL超时的解决方法)
  • 中国的超算中心使用情况如何?是否算力过剩
  • Eyevinn 彻底改变开源部署模式
  • 初步认识AMSU-A/B、HIRS-3/4、MHS、ATMS、GOES
  • 字典列表依据数值键排序
  • 【跨国数仓迁移最佳实践5】MaxCompute近线查询解决方案助力物流电商等实时场景实现高效查询
  • 防火墙安全作用及 firewalld 交互、端口配置
  • zookeeper3.8.4安装以及客户端C++api编译
  • hyper-v虚拟机启动失败:Virtual Pci Express Port无法打开电源,因为发生错误,找不到即插即用设备
  • ESP32-menuconfig(2) -- Application manager
  • Lazada东南亚矩阵营销破局:指纹手机如何以“批量智控+数据中枢”重构运营生态
  • Dart关键字完全指南:从基础到高级用法详解
  • 商品期货场外期权系统解决方案:跨境金融科技赋能大宗商品风险管理
  • 【代码随想录day 15】 力扣 110.平衡二叉树
  • Android初学者系统开发学习路线参考
  • Zabbix网络发现:自动化监控新利器
  • 【无标题】无名管道
  • NY128NY133美光固态闪存NY139NY143
  • 施耐德Twido PLC怎么实现远程上下载程序和编程配置?
  • F5发布业界首创集成式应用交付与安全平台,开启ADC 3.0新时代
  • 安全常见漏洞
  • openpnp - 不连接设备,只大概测试一下摄像头是否好使
  • Java中的方法引用操作符(::)详解与实战应用
  • Linux 运维与优化的系统化思维:从内核到生产环境的全链路管理
  • 【C++】类和对象--类中6个默认成员函数(2) --运算符重载
  • 笔试——Day32
  • 基于LLM的Chat应用测试方法探索:系统化评估与持续优化
  • 企业本地知识库助手 大模型+本地知识库
  • Prometheus 监控平台部署与应用
  • 【代码随想录day 14】 力扣 104.二叉树的最大深度