Symfony 5 API关闭debug模式后跨子域请求出现CORS错误
问题原因
- 跨域配置规则不匹配:你的
nelmio_cors.yaml中开启了origin_regex: true参数,该参数要求allow_origin的取值必须为正则表达式格式,但你填写的是普通域名字符串。Debug模式下框架自带容错机制,不会严格校验规则,因此跨域配置可以正常生效;关闭Debug进入严格的生产模式后,规则校验不通过,导致跨域配置失效,响应头不会返回Access-Control-Allow-Origin相关字段。 - 生产环境配置缓存未更新:Symfony生产环境会将所有配置、容器编译结果缓存到本地,Debug模式下会自动检测配置变更并刷新缓存;关闭Debug后如果没有手动清理过缓存,修改后的跨域配置不会被加载。
- OPcache缓存旧配置:生产环境通常会开启PHP OPcache缓存编译后的PHP文件,你的
.env.local.php或容器配置可能被OPcache缓存,导致新配置没有生效。
解决方案
- 修正nelmio跨域配置,两种方案二选一即可:
- 关闭
origin_regex参数,保留原域名字符串配置:
nelmio_cors: defaults: origin_regex: false # 关闭正则匹配,支持直接填写完整域名 allow_credentials: true allow_origin: ['https://api.mamacita365.com', 'https://app.mamacita365.com'] allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE'] allow_headers: ['Content-Type', 'Authorization'] expose_headers: ['Link'] max_age: 3600 paths: '^/': null- 保留
origin_regex: true,将allow_origin改为符合要求的正则格式:
allow_origin: ['^https://api\.mamacita365\.com$', '^https://app\.mamacita365\.com$'] - 关闭
- 清理Symfony生产环境缓存,在项目根目录执行以下命令:
php bin/console cache:clear --env=prod - 重启PHP-FPM服务或重置OPcache,清除旧的PHP文件编译缓存。
内容的提问来源于stack exchange,提问作者nordictelecom
相关产品推荐
相关产品推荐

