由于我们服务端设置了Access-Control-Allow-Headers : *,导致OPTIONS一直返回空的响应头,无法跨域。
/**
* ios 12版本以下, Access-Control-Allow-Headers 为通配符 ’*‘ 引发报错
* 设置 请求头白名单加当前请求请求头,问题解决
*/
app.all('*', function (req, res, next) {
const headersKeys = Object.keys(req.headers);
const whiteHeaders = ["version", "uuid", "platform_version_name", "platform_version_code", "sn", "udid","operator","channel","store_id","Content-Type","Content-Length","Authorization","Accept","X-Requested-With"];
const allowHeaders = _.uniq([...headersKeys, ...whiteHeaders])
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", `${allowHeaders}`);
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
在IOS12版本下,是浏览器内核触发了cors拦截,但仅仅拦截了非简单跨域请求。如果你的请求是简单请求,那么在IOS12版本下不会出现这个问题。
MDN 简单请求
developer.mozilla.org/zh-CN/docs/…
掘金文章
axios issues
stackoverflow 问答