【问题标题】:In HTTP logs I am seeing OPTIONS, GET, OPTIONS, POST why?在 HTTP 日志中,我看到 OPTIONS、GET、OPTIONS、POST 为什么?
【发布时间】:2014-10-09 01:42:50
【问题描述】:

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

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

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

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

【问题讨论】:

  • 与实际请求相比,进行预检检查有什么好处?为什么我要对每个请求执行此操作,而不是只发出一半的请求并等待 4xx 响应?
  • 查看我修改后的答案。我已经为预检请求的原因添加了解释。

标签: http get options


【解决方案1】:

这可能是正在发出的 CORS 请求。请参阅 this MDN page 了解 CORS 的工作原理。

基本上,在发出实际请求之前,客户端会发出一个 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 请求,不需要预检请求。

【讨论】:

    【解决方案2】:

    OPTIONS 请求作为 CORS 请求的预检执行,以确保允许来源。

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 2023-03-26
      • 2016-12-08
      • 2011-06-07
      • 2017-06-18
      相关资源
      最近更新 更多