Symfony API跨域CORS配置及Angular5+Symfony部署跨域问题
我来帮你搞定这个头疼的CORS问题!你遇到的Cross-Origin Request Blocked: Reason: CORS preflight channel did not succeed错误,核心原因是Symfony没有正确处理OPTIONS预检请求,而Apache全局配置往往没法覆盖到应用层的路由规则,尤其是Symfony的路由系统会拦截请求,导致服务器级的CORS配置失效。下面是最可靠的解决方案:
第一步:安装Symfony官方推荐的CORS处理Bundle
直接用nelmio/cors-bundle,它是Symfony生态中专门处理CORS的组件,能在应用层精准控制跨域规则,避免和服务器配置冲突。
在项目根目录执行Composer命令:
composer require nelmio/cors-bundle
第二步:配置CORS规则
安装完成后,在config/packages/nelmio_cors.yaml文件中添加以下配置(如果文件不存在就新建一个):
nelmio_cors: defaults: origin_regex: true # 测试阶段可以用*允许所有域名,生产环境一定要替换成你的Angular实际域名,比如['http://localhost:4200'] allow_origin: ['*'] # 必须包含OPTIONS方法,因为预检请求用的就是OPTIONS allow_methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'] # 允许Angular发送的常用请求头,根据你的实际需求添加 allow_headers: ['Content-Type', 'Authorization', 'X-Requested-With'] expose_headers: ['Link'] # 预检请求的缓存时间,减少重复OPTIONS请求 max_age: 3600 paths: # 匹配所有API路径,确保你的所有/api/**请求都能被覆盖 '^/api/': ~
第三步:验证配置并排除冲突
- 暂时注释Apache中的CORS配置:因为应用层的CORS配置优先级更高,服务器级的配置可能会和它冲突,先关掉Apache里的相关规则,避免干扰。
- 重启服务:如果用的是Symfony内置服务器,执行
symfony server:restart;如果是Apache/Nginx,重启对应的服务。 - 用浏览器开发者工具检查请求:打开网络面板,找到失败的请求,查看对应的OPTIONS预检请求的响应头,确认是否包含
Access-Control-Allow-Origin、Access-Control-Allow-Methods等正确的CORS头。
为什么之前的某个POST路径能正常工作?
你提到/some-url/adicionar(POST请求)可以运行,大概率是因为这个请求属于简单请求:
简单请求的判定条件:POST方法,且Content-Type是
application/x-www-form-urlencoded、multipart/form-data或text/plain,没有自定义请求头。
这类请求不会触发OPTIONS预检,所以即使没有配置CORS,浏览器也会允许;而其他需要自定义头、非简单Content-Type(比如application/json)的POST,或者PUT/DELETE请求,都会触发预检,这时候如果Symfony没处理OPTIONS请求,就会报错。
按照上面的步骤配置后,所有需要预检的请求都会被正确处理,跨域问题应该就能解决了!
内容的提问来源于stack exchange,提问作者Juan I. Morales Pestana

