Vue中文社区

被 CORS 气到想砸电脑?我用这一招,本地开发一键解套

CORS 报错

你在做一个 React 或 Next.js 的前端。 你准备从某个 API 拉数据。 你手一抖,fetch 发出去,然后——

Access to fetch at 'https://api.example.com/data'
from origin 'http://localhost:3000' has been blocked
by CORS policy.

砰!CORS 报错直击灵魂。 如果你经历过,你就懂那种无力感。

⚠️ 这玩意儿为啥老来找茬?

CORS(跨域资源共享)是浏览器内置的安全机制:它会阻止localhost:3000 的前端代码,直接去请求另一个来源(比如 api.example.com),除非对方服务端明确放行相应的 CORS 头。

然而,当你不掌控后端时,你就被动了。 至少,我曾经以为我被卡死了。

救我于水火的偏方:本地代理

与其苦苦央求后端改 CORS,不如在本地起一个代理,把前端请求“伪装”成同源再转发出去。因此,浏览器不拦你,你也不再被吊打。

操作就三步:

1)安装 http-proxy-middleware

npm install http-proxy-middleware

2)Create React App 项目里,新建/编辑 src/setupProxy.js:

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function (app) {
  app.use(
'/api',
    createProxyMiddleware({
target: 'https://api.example.com',
changeOrigin: true,
pathRewrite: {
'^/api': '', // 转发前去掉 /api 前缀
      },
    })
  );
};

3)前端代码里改成这样:

fetch('/api/data') // 不再直打 https://api.example.com/data

搞定CORS 直接消失。

⚙️ 加餐:Next.js 的写法在 Next.js 里,创建 next.config.js:

module.exports = {
async rewrites() {
return [
      {
source: '/api/:path*',
destination: 'https://api.example.com/:path*',
      },
    ];
  },
};

此后你依然请求 /api/...,但 Next.js 会在服务端把请求代理到真实地址。于是,不需要动后端,CORS 也不再作妖。

🤯 为啥它就灵了?因为请求不是由浏览器跨域发出,而是由(本地)服务端/开发服务器代劳:

代理替你“出面”,再把结果转交给前端。

浏览器的 CORS 策略因此不被触发。

听起来“像开了挂”,但这真的合法合规。


🛠 我常用的工具清单

  • http-proxy-middleware(CRA 场景稳)
  • Next.js rewrites(服务端转发更优雅)
  • cors-anywhere(临时测试、权衡使用)

最后

刚接触 API 的同学,遇到 CORS 往往会被绕进一个黑洞。 然而,只要你换个路径:让请求经由代理从服务端发出,而不是从浏览器硬跨域,问题就轻松化解。 这招,曾替我在上线前省下好几天的来回扯皮。 希望也能帮到此刻的你。