Chrome环境下Symfony 5使用Nelmio CORS bundle出现CORS跨域问题
问题原因
你观察到的重复CORS响应头就是导致部分用户报错的核心诱因:
- Chrome浏览器对重复的CORS相关响应头兼容性处理存在差异,部分版本/网络环境下会直接判定响应头无效,忽略所有CORS配置,从而抛出
No 'Access-Control-Allow-Origin' header is present的错误; - 你当前的配置同时在Nginx层和Symfony的Nelmio CORS bundle层都配置了CORS响应头,两边规则叠加就会出现重复头的问题。
解决方案
- 删除Nginx层的CORS配置
直接注释或删除nginx.conf中以下两行配置,所有CORS规则统一交给Nelmio CORS bundle管理即可:
# add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS, PATCH' always; # add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
- 修正Nelmio CORS配置的冗余项
你当前配置的allow_headers中包含了Access-Control-Allow-Origin、Access-Control-Allow-Credentials两个响应头字段,这两个字段是服务端返回给客户端的,不属于客户端请求允许携带的请求头范围,直接删除即可:
# 修正后的allow_headers配置 allow_headers: ['Content-Type', 'Authorization', 'X-Auth-Api']
- 确保OPTIONS请求全部交给Symfony处理
避免Nginx直接响应OPTIONS预检请求导致头缺失,在nginx.conf的server块中补充以下规则:
if ($request_method = OPTIONS) { rewrite ^(.*)$ /index.php last; }
- 检查CDN/代理规则(可选)
从你配置的CF-Connecting-IP可知你使用了Cloudflare CDN,需要确认:
- Cloudflare的规则中没有额外添加CORS响应头
- 针对API路径的OPTIONS预检请求关闭缓存,避免缓存旧的错误响应头
修改完成后清空Symfony缓存、重启Nginx即可验证效果。
内容的提问来源于stack exchange,提问作者Paganel
相关产品推荐
相关产品推荐

