我目前正在审核一些代理日志并看到:
200 OPTIONS /api/bob/
200 GET /api/bob/
200 OPTIONS /api/jim/
200 PUT /api/jim/
我想知道几件事,为什么在每个请求之前进行OPTIONS调用? 而且,我的主要问题是:这样做有什么好处?
我原以为这会增加延迟和不必要的开销。
答案 0 :(得分:4)
这可能是正在提出的CORS请求。有关CORS如何工作的解释,请参阅this MDN page。
基本上,在发出实际请求之前,客户端会发出OPTIONS请求,要求获得实际请求的许可。这被称为“预检请求”。
但有一件事 - CORS不要求客户端在HTTP GET之前发出OPTIONS请求。所以客户可能行为不端。
你可以通过调查他们的标题来验证OPTIONS是否是由CORS引起的 - 如果它们有Access-Control-Request-Method
和Access-Control-Request-Headers
标题,这是一个预检请求,它就是CORS。
为什么需要预检请求?
CORS由浏览器强制执行。默认情况下,大多数现代浏览器不允许Web JS代码向托管此页面的不同服务器发出AJAX请求。这是一项安全措施。
CORS是浏览器(不是页面本身!)的一种方式,可以询问服务器是否可以安全地发出实际请求。
对于可以修改服务器资源的方法 - 例如大多数POST和所有PUT方法 - 浏览器必须首先询问是否可以进行此修改。支持CORS的服务器将在预检响应中包含特殊标头。
没有预检请求:让我们假设浏览器向不支持CORS的服务器发出请求。在这种情况下,发出请求可能会修改资源。我们不想要这个!
对于不应更改资源状态的GET请求,不需要预检请求。
答案 1 :(得分:1)
OPTIONS请求作为CORS请求的预检执行,以确保允许原点。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests