在HTTP日志中,我看到OPTIONS,GET,OPTIONS,POST为什么?

Mr_*_*oad 5 get http options

我目前正在审查一些代理日志并看到:

200 OPTIONS   /api/bob/
200 GET       /api/bob/
200 OPTIONS   /api/jim/
200 PUT       /api/jim/
Run Code Online (Sandbox Code Playgroud)

我想知道几件事,为什么在每个请求之前进行OPTIONS调用?而且,我的主要问题是:这样做有什么好处?

我原以为这会增加延迟和不必要的开销.

kam*_*uel 5

这可能是正在发出 CORS 请求。有关CORS 工作原理的说明,请参阅此 MDN 页面

基本上,在发出实际请求之前,客户端会发出一个 OPTIONS 请求,以请求获得发出实际请求的许可。这称为“预检请求”。

不过有一件事 - CORS 不需要客户端在 HTTP GET 之前发出 OPTIONS 请求。所以客户可能行为不端。

您可以验证是否选项是由CORS引起调查其头-如果它们有Access-Control-Request-MethodAccess-Control-Request-Headers头,这是一个预检要求,它的CORS。


为什么需要预检请求?

CORS 由浏览器强制执行。默认情况下,大多数现代浏览器不允许 Web JS 代码向托管此页面的不同服务器发出 AJAX 请求。这是一种安全措施。

CORS 是浏览器(不是页面本身!)询问服务器发出实际请求是否安全的一种方式。

对于可以修改服务器上资源的方法 - 例如大多数 POST 和所有 PUT 方法 - 浏览器必须首先询问是否可以进行这种修改。支持 CORS 的服务器将在预检响应中包含特殊标头。

没有预检请求:假设浏览器向不支持 CORS 的服务器发出请求。在这种情况下,发出请求可能会修改资源。我们不想要这个!

对于不应更改资源状态的 GET 请求,不需要预检请求。