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

Strapi v4.5.3配置CORS中间件后仍出现跨域错误的求助

Strapi v4.5.3配置CORS中间件后仍出现跨域错误的求助

我来帮你排查这个跨域问题,从你描述的情况来看,核心问题是Strapi返回的Access-Control-Allow-Origin头和请求源不匹配,而且返回的是你配置列表里的最后一个域名,咱们一步步来解决:

1. 先修复环境变量的分割逻辑

你当前用split(', ')来分割环境变量里的域名,但这个写法依赖于逗号后面必须有空格,一旦部署环境里的环境变量不小心丢失了空格(比如复制粘贴时出错、或者某些平台自动压缩空格),就会导致分割后的数组异常。

建议把分割逻辑改成正则匹配,兼容逗号后有无空格的情况,修改middleware.ts里的origin配置:

origin: process.env.CORS_ORIGINS
  ? process.env.CORS_ORIGINS.split(/,\s*/) // 匹配逗号+任意数量空格
  : '*',

2. 确认生产环境已重启Strapi

修改middleware.ts或者.env后,生产环境的Strapi必须重启才能加载新的配置,很多人会忽略这一点,导致旧的CORS设置还在生效。如果是用Docker部署的,记得重新构建镜像或者重启容器;如果是PM2托管的,执行pm2 restart strapi即可。

3. 检查反向代理是否覆盖了CORS头

如果你的生产环境用了Nginx、Apache这类反向代理,要检查代理配置里有没有手动设置Access-Control-Allow-Origin头。如果代理层加了这个头,会直接覆盖Strapi返回的头,导致出现错误的域名。

比如Nginx里如果有类似下面的配置,就会覆盖Strapi的CORS设置,需要删除或者调整:

add_header Access-Control-Allow-Origin https://portal-cms.example.bop;

4. 尝试用函数式配置手动匹配请求源

如果上面的方法都没解决,可以试试把origin改成函数形式,手动判断并返回匹配的请求源,这样更灵活可控:

origin: (ctx) => {
  const allowedOrigins = process.env.CORS_ORIGINS
    ? process.env.CORS_ORIGINS.split(/,\s*/)
    : ['*'];
  // 如果请求源在允许列表里,或者允许所有源,就返回请求源
  if (allowedOrigins.includes(ctx.request.headers.origin) || allowedOrigins.includes('*')) {
    return ctx.request.headers.origin;
  }
  // 不允许的源返回false,会触发CORS错误
  return false;
},

做完这些调整后,再测试从localhost:6006请求生产环境的Strapi,应该就能正常返回匹配的Access-Control-Allow-Origin头了。

备注:内容来源于stack exchange,提问作者lando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:07:59