if ($request_method = OPTIONS) {
  add_header Access-Control-Allow-Origin $http_origin always;
  add_header Access-Control-Allow-Methods 'GET,POST,PUT,DELETE' always;
  add_header Access-Control-Allow-Headers 'Content-Type,Authorization' always;
  return 204;
}

用命令行调接口返回 200,浏览器里同一个请求报跨域,控制台提示预检失败。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,浏览器在发送实际请求前先发 OPTIONS 预检,服务端未正确响应。

「CORS 预检失败」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

处理上按这个顺序:服务端处理 OPTIONS 并返回允许的方法与头;带凭证时明确来源;避免通配符与凭证同用。

改完只确认一件事:浏览器预检返回 204,实际请求成功,控制台无跨域报错。

作者 9823189