我想我对 CORS 非常了解,但是当涉及到预检请求时,我仍然对浏览器的行为感到有点困惑。
假设浏览器发出此预检请求:
OPTIONS http://myserver.local:7000/api/order/4 HTTP/1.1
Host: myserver.local:7000
Connection: keep-alive
Accept: */*
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-my-custom-header
Origin: http://localhost:5000
Sec-Fetch-Mode: cors
Referer: http://localhost:5000/
Run Code Online (Sandbox Code Playgroud)
我的 API 返回:
HTTP/1.1 204 No Content
Date: Wed, 09 Mar 2022 12:52:50 GMT
Server: Kestrel
Access-Control-Allow-Headers: x-my-custom-header
Access-Control-Allow-Methods: PUT,DELETE
Access-Control-Allow-Origin: http://localhost:5000
Vary: Origin
Run Code Online (Sandbox Code Playgroud)
请注意,服务器允许在预检请求的响应中使用PUT和方法,但不允许,这是实际 CORS 请求的方法。DELETEPOST
由于实际请求的方法与标头中列出的方法不匹配,浏览器是否应该阻止此请求Access-Control-Allow-Methods?或者服务器用20x状态代码响应浏览器接受预检然后发送实际请求就足够了吗?
我的假设是,如果请求的方法不匹配,浏览器会比较允许方法并阻止请求......我错过了什么吗?