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 头信息,放行指定来源的请求。

配置代码示例
javascript 复制代码
// 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. 生产环境调整

    • 部署时需将来源替换为真实域名:

      javascript 复制代码
      value: process.env.NODE_ENV === "production" 
        ? "https://your-production-domain.com" 
        : "http://127.0.0.1:8999"

验证配置是否生效

使用 curl 测试响应头:

bash 复制代码
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)。

相关推荐
雪芽蓝域zzs6 分钟前
第三十七节:防抖、节流封装(composables 通用函数,搜索框防重复请求)
前端·javascript·vue.js
wuyk55525 分钟前
18.Kruskal 算法:用最短的边连成一张网
开发语言·算法·图论
Evand J26 分钟前
【MATLAB例程,图像降噪7】高斯加权滑动窗口滤波,用于图像降噪,带质量评价,附代码下载链接
开发语言·图像处理·matlab·滑动窗口·滤波·降噪·图像滤波
十年一梦惊觉醒35 分钟前
快手视频发布助手,全自动视频发布带货工具
开发语言·前端·javascript
Java后端的Ai之路36 分钟前
一文搞懂 GitHub Actions-CICD
开发语言·大模型·github·cicd·action
超人气王37 分钟前
细说agent心跳机制--agentLoop循环机制中死循环处理,带你进一步了解agent工作底层原理
javascript·人工智能
码匠许师傅39 分钟前
【C++三方组件】开篇总论:为什么需要以及如何选型?
开发语言·c++
cvby1 小时前
C++11--右值引用和移动语义
开发语言·c++
dsyyyyy11011 小时前
Typescript装饰器
前端·javascript·typescript
en.en..1 小时前
TCP/UDP 收发流程(网络字节序---函数讲解)
开发语言·php