add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Credentials true; add_header Vary Origin;
带 credentials 的跨域请求发出去以后,控制台报 The value of the 'Access-Control-Allow-Origin' header must not be the wildcard '*' when the request's credentials mode is 'include',接口其实返回了 200,页面却一个字段都读不到,同一份配置换浏览器表现也一样。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:规范不允许通配符和凭据同时出现,服务端把 Origin 回成了星号,浏览器就判定这条响应不可用,其实请求早就到服务端并且处理完了。
「CORS 通配符凭据」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
处理上按这个顺序:Allow-Origin 改成回显具体的来源域名,同时把 Vary 响应头一起加上;Allow-Credentials 设成 true,把允许的方法和请求头都一个个显式列出来;确认网关和框架没有各写一份互相覆盖,只留一处配置。
确认没问题再收工,带凭据的跨域请求返回 200,响应头里已经是具体域名而不是星号。
