浏览器控制台报 The Access-Control-Allow-Origin header contains multiple values '*, https://app.example.com',接口本身返回 200。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
curl -sI https://api.example.com/user | grep -i access-control proxy_hide_header Access-Control-Allow-Origin; add_header Access-Control-Allow-Origin https://app.example.com always;
上游应用已经输出了 CORS 头,Nginx 又 add_header 了一遍,两个值被合并成一行。浏览器只接受单个 Origin 或一个星号。这一点先确认清楚,后面就不用反复试。
「跨域头重复」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
具体做法是,用 curl -I 看响应里 CORS 头出现了几次;只保留一层输出 建议放在应用或网关其中一处;Nginx 侧要用时先 proxy_hide_header 把上游的去掉;带 Cookie 的请求不能用星号 要回显具体 Origin。
改完照着核一遍,响应里 Access-Control-Allow-Origin 只有一行 浏览器不再报 multiple values。
