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

时间:2014-08-15 09:47:37

标签: http get options

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

200 OPTIONS   /api/bob/
200 GET       /api/bob/
200 OPTIONS   /api/jim/
200 PUT       /api/jim/

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

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

2 个答案:

答案 0 :(得分:4)

这可能是正在提出的CORS请求。有关CORS如何工作的解释,请参阅this MDN page

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

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

你可以通过调查他们的标题来验证OPTIONS是否是由CORS引起的 - 如果它们有Access-Control-Request-MethodAccess-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