nginx配置跨域--OPTIONS
今天在看一个跨域问题,主请求是一个PATCH请求,该请求并没有携带origin,然后直接报跨域。因此它也不会走到nginx配置的以下逻辑:
if ($http_origin ~* (zz.com)) {
add_header 'Access-Control-Allow-Origin' '$http_origin' always;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' '*';
add_header 'Access-Control-Allow-Headers' '$http_access_control_request_headers' always;
add_header 'Access-Control-Expose-Headers' '*' always;
}
然后它下面紧跟着一个OPTIONS请求,请求是没问题的,它是由如下分支返回的:
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE' always;
add_header 'Access-Control-Allow-Headers' '*' always;
add_header 'Access-Control-Max-Age' 1728000 always;
add_header 'Content-Length' 0;
add_header 'Content-Type' 'text/plain; charset=utf-8';
return 204;
}
这个是以前前端同学配的,而且已经跑路,导致我其实有些困惑,因此研究了一下这个OPTIONS请求。
在跨域请求中,当发送 `PATCH` 请求时,浏览器会先发送一个 `OPTIONS` 请求进行预检。这是根据跨域资源共享(CORS)规范定义的行为。 预检请求的目的是为了检查服务器是否允许实际请求的跨域访问。在预检请求中,浏览器会发送一个 `OPTIONS` 请求,并携带一些跨域相关的头字段,如 `Origin`、`Access-Control-Request-Method`、`Access-Control-Request-Headers` 等。 服务器在接收到预检请求后,会根据请求头中的信息进行验证,并返回相应的响应头。如果服务器允许实际请求的跨域访问,它会在响应头中包含 `Access-Control-Allow-Origin`、`Access-Control-Allow-Methods`、`Access-Control-Allow-Headers` 等字段。 只有在服务器返回的预检请求的响应头中包含了 `Access-Control-Allow-Origin` 字段,并且允许请求的方法和头字段,浏览器才会继续发送实际的 `PATCH` 请求。 因此,当你在发送 `PATCH` 请求时,如果服务器没有正确配置跨域访问的相关响应头,浏览器会先发送一个 `OPTIONS` 请求进行预检,然后根据预检请求的响应头来决定是否继续发送实际的 `PATCH` 请求。 需要注意的是,预检请求和实际请求是两个独立的请求,它们之间可能存在一定的时间间隔。这也是为什么在某些情况下,`OPTIONS` 请求会在 `PATCH` 请求之前的原因。
因此怀疑是预检查返回的信息有问题,而且其他的GET之类的请求就毫无问题,因此把Access-Control-Allow-Methods中加上PATCH:
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always;
恢复正常